Java中私有构造函数的作用是什么?

33

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


3
当你不希望有人通过调用构造函数来创建你的类的实例时。 - chris
可能是重复的 - https://dev59.com/RnE85IYBdhLWcg3wXCMv - mtk
@R Martinho Fernandes,我也想知道关于C++的这个问题的答案... - New_User
1
然后你需要修改你的问题。你只是在问一个Java场景。 - Thorsten Dittmar
@AmrutDange,C++提供了使用自由函数而不是实用类的替代解决方案,因此这个问题已经解决了。 - chris
可能是在类中将构造函数设为私有的用途是什么?的重复问题。 - Ashish Aggarwal
11个回答

43

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

实际上,私有构造函数的一个很好的用途是在单例模式中。以下是一个示例:

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;
   }
}

这样你可以确保只有一个实例的类是活动的。

其他用途可以是创建一个实用类,该类仅包含静态方法。

要进行更多分析,您可以查看其他Stack Overflow答案

Java中的构造函数可以是私有的吗?

将构造函数设置为私有有什么用处?

私有构造函数


9
如其他回答所提到的,常见用途包括单例模式、内部构造函数链和另一个:
Java不支持C#中所谓的“静态类”-换句话说,是实用工具类。实用工具类是帮助类,应该仅包含静态成员(例如Java中的Math和System)。以任何方式对其进行实例化都没有意义。
在C#中,使类为静态类会使它隐式地同时为final(最终)/sealed(密封)和abstract(抽象)。在Java中,没有这样的关键字,并且不能将类设置为final和abstract。因此,如果您有这样的实用程序类,您将使其为final并给它一个永远不会被调用的私有构造函数。

顺便提一下,静态类的新方法是“枚举”。 - Marko Topolnik
1
@MarkoTopolnik 你能举个例子吗? - Theodoros Chatzigiannakis
1
public enum Utility {; public static void fn1() {} } - Marko Topolnik
@MarkoTopolnik 哇,以前从未见过这样的东西。绝对有趣。 - Theodoros Chatzigiannakis

8

私有构造函数用于禁止外部初始化该类
应用场景

情况一:创建单例模式时使用

public class SingletonClass {

    public static SingletonClass singletonClass;

    private SingletonClass() {
    }

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

在这种情况下,getInstance方法只完成初始化。任何人都不能从外部创建SingletonClass的对象。
第二种情况是当您不希望有任何对象实例存在时,如在util类中。
public final class Util {

    private Util() {
    }
}

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


根据https://dev59.com/OXRC5IYBdhLWcg3wW_tk的说法,我认为使用静态工具类时,不需要创建私有构造函数。 - Nam Vu
1
@ZuzooVn 在Java中,您不能将类创建为静态。您在评论中提到的问题基于C#语言。 - Ashish Aggarwal
“没有人可以在外部创建SingletonClass的对象。”如果在外部使用“SingletonClass s = SingletonClass.getInstance();”呢?我认为你例子中的好处是防止出现多个SingletonClass实例。 - 林果皞

6

以下是需要使用私有构造函数的一些情况:

  1. 单例模式

  2. 工厂方法

  3. 仅包含静态方法(实用程序)的类

  4. 仅包含常量的类

您也可以参考以下代码:

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;
    }
}

5
使用私有构造函数可以防止对象被“外部”创建。这通常用于诸如单例模式之类的东西,它试图确保该类的只存在一个实例。这个单例链接也提供了一些很好的描述... 点击此链接

2
作为其他答案的补充:
如果您想创建一个单例类,您需要隐藏构造函数,这样它只能在内部调用。

是的,看看其他50个回答告诉你同样的事情 :-D - Thorsten Dittmar

1
你可能不希望用户直接实例化该类,而是使用一个方便的静态方法。例如,在一个非常牵强的构建器示例中:
public FooBuilder {

    private FooBuilder(FooBar bar) {
        ...
    }

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

}

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

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

1

在我看来,一些用法如下:

  1. 在单例中使用
  2. 从另一个构造函数中使用

0

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

例如:

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枚举所取代。


0

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

  1. 设计单例模式(对象的唯一实例在所有对象之间共享)。

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

3.防止子类化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接