33

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

4

11 回答 11

42

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

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

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

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

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

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

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

在类中将构造函数设为私有有什么用?

私有构造函数

于 2013-06-27T12:15:15.823 回答
9

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

Java 不支持 C#(例如)中所谓的“静态类”——换句话说,实用程序类。实用程序类是一个助手类,它应该只包含静态成员。( JavaMathSystem就是这种情况。)以任何方式实例化它们都是没有意义的。

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

于 2013-06-27T12:21:12.383 回答
8

当您希望此类不能从外部初始化时使用 私有构造函数


例 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 类中,所有方法都是静态的,因此不需要创建其对象,因此在这种情况下使用私有构造函数

于 2013-06-27T12:14:39.213 回答
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;
    }
}
于 2013-06-27T12:17:46.037 回答
5

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

该链接还提供了一些很好的描述...

于 2013-06-27T12:13:51.640 回答
2

作为其他答案的补充:

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

于 2013-06-27T12:13:31.693 回答
1

恕我直言,一些用法是

  1. (辛格尔顿)
  2. 从另一个构造函数..
于 2013-06-27T12:14:14.040 回答
1

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

public FooBuilder {

    private FooBuilder(FooBar bar) {
        ...
    }

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

}

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

FooBuilder.using(bar) // further chained methods etc...
于 2013-06-27T12:23:43.697 回答
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 枚举所取代。

于 2013-06-27T12:20:11.957 回答
0

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

于 2013-06-27T12:12:55.893 回答
0

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

  1. 能够设计单例模式(所有对象之间仅共享对象的一个​​实例)。

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

3.防止子类化。

于 2020-11-20T09:33:56.273 回答