Java中私有构造函数有啥用?

Posted

技术标签:

【中文标题】Java中私有构造函数有啥用?【英文标题】:What's the use of private constructor in Java?Java中私有构造函数有什么用? 【发布时间】:2013-06-24 22:26:04 【问题描述】:

我想知道私有构造函数在 Java 中的用途。 在 Java 中使用私有构造函数有哪些不同的方法?

【问题讨论】:

当你不想让别人创建你的类的实例时(至少通过调用构造函数)。 可能重复 - ***.com/questions/2816123/… @R Martinho Fernandes 我也想回答这个关于 C++ 的问题...... 那么你需要改变你的问题。您只是要求一个 Java 场景。 @AmrutDange,好吧,C++ 提供了一种替代解决方案,它使用免费函数而不是实用程序类,所以没有了。 【参考方案1】:

当您不希望某个特定类被实例化时。

【讨论】:

【参考方案2】:

作为其他答案的补充:

如果要创建单例类,需要隐藏构造函数,所以只能在内部调用。

【讨论】:

是的,看看其他 50 个答案告诉你同样的事情:-D【参考方案3】:

使用私有构造函数会阻止它被对象“外部”的任何东西创建。这通常用于singleton 模式之类的东西,它试图确保只存在一个类的实例。

This link also 提供了一些很好的描述...

【讨论】:

【参考方案4】:

恕我直言,一些用法是

    在单身 来自另一个构造函数..

【讨论】:

【参考方案5】:

私有构造函数用于当你希望这个类不能从外部初始化时 用途 案例 1: 创建 sington 类时

public class SingletonClass 

    public static SingletonClass singletonClass;

    private SingletonClass() 
    

    public static SingletonClass getInstance() 
        if(singletonClass == null) 
            singletonClass = new SingletonClass();
        
        return singletonClass;
    

在这种情况下,只有通过 getInstance 方法进行初始化。没有人可以在外面创建单例类形式的对象。

案例 2: 当您不想要 util 类中的任何对象实例时

public final class Util 

    private Util() 
    

在 util 类中,所有方法都是静态的,因此不需要创建其对象,因此在这种情况下使用私有构造函数

【讨论】:

根据***.com/questions/323022/…我认为使用静态util类,您不需要创建私有构造函数。 @ZuzooVn 在java中你不能创建静态类。您在评论中提到的问题是基于 C# 语言的 "没有人可以从外面创建SingletonClass的Object。" 如果外面做SingletonClass s = SingletonClass.getInstance(); ?我认为您示例中的好处是防止存在多个 SingletonClass 实例。【参考方案6】:

私有构造函数是为了限制类的实例化。

实际上,私有构造函数的一个很好的用法是在单例模式中。这是一个例子

public class ClassicSingleton 
   private static ClassicSingleton instance = null;
   private ClassicSingleton() 
      // Exists only to defeat instantiation.
   
   public static ClassicSingleton getInstance() 
      if(instance == null) 
         instance = new ClassicSingleton();
      
      return instance;
   

这样您可以确保只有一个实例类处于活动状态。

其他用途可以是创建一个实用程序类,它只包含静态方法。

更多分析,您可以查看其他堆栈溢出答案

Can a constructor in Java be private?

What is the use of making constructor private in a class?

private constructor

【讨论】:

【参考方案7】:

您可能需要私有构造函数的一些原因:

为了防止在对象之外实例化,在以下情况下:

    单例

    工厂方法

    仅静态方法(实用程序)类

    仅常量类

你也可以参考这段代码:

public class MySingletonEx 


    private static MySingletoneEx instance = new MySingletonEx("This takes a string");;

    private MySingletonEx(final String myString)
    
        // This is a private constructor
    

    public static MySingletonEx getInstance() 
    
        return instance;
    

【讨论】:

【参考方案8】:

私有构造函数的另一个用途是确保只存在一个类的有限实例集。

例如:

public class Color

    public static final Color red = new Color("red");
    public static final Color yellow = new Color("yellow");
    public static final Color blue= new Color("blue");

    private Color(String name) 
        this.name = name;
    

    .
    .
    .

不过,这种用法大部分已被 Java 枚举所取代。

【讨论】:

【参考方案9】:

正如其他答案所述,常见用途包括单例模式、内部构造函数链接等等:

Java 不支持在 C# 中(例如)称为“静态类”的东西 - 换言之,实用程序类。实用程序类是一个助手类,它应该只包含静态成员。 (MathSystem 在 Java 中就是这样的情况。)以任何方式实例化它们都是没有意义的。

在 C# 中,将类设为静态会使其隐含地成为最终/密封和抽象。在 Java 中,没有这样的关键字,您不能将类 final 抽象化。因此,如果你有这样一个实用程序类,你会将它设为 final 并给它一个从未调用过的私有构造函数。

【讨论】:

顺便说一句,静态类的新方法是enum @MarkoTopolnik 你能举个例子吗? public enum Utility ; public static void fn1() @MarkoTopolnik 哇。以前没见过。绝对有趣。【参考方案10】:

对于一个非常人为的构建器示例,您可能不希望该类的用户直接实例化它,而是使用方便的静态方法:

public FooBuilder 

    private FooBuilder(FooBar bar) 
        ...
    

    public static FooBuilder using(FooBar bar) 
        return new FooBuilder(bar);
    


然后通过调用静态方法来使用它:

FooBuilder.using(bar) // further chained methods etc...

【讨论】:

【参考方案11】:

以下是私有构造函数的一些用途。

    能够设计单例模式(所有对象仅共享一个对象实例)。

2.限制实例创建的数量。

3.防止子类化。

【讨论】:

以上是关于Java中私有构造函数有啥用?的主要内容,如果未能解决你的问题,请参考以下文章

构造函数有啥用? [关闭]

静态构造函数有啥用?

私有构造函数有啥作用? [复制]

声明构造函数私有和 =delete 有啥区别?

javascript中的new有啥用

如果您可以通过反射访问它们,那么拥有私有构造函数有啥意义?