我想知道私有构造函数在 Java 中的用途。在 Java 中使用私有构造函数有哪些不同的方法?
11 回答
私有构造函数当然是为了限制类的实例化。
实际上,私有构造函数的一个很好的用途是在单例模式中。这是一个例子
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 不支持 C#(例如)中所谓的“静态类”——换句话说,实用程序类。实用程序类是一个助手类,它应该只包含静态成员。( JavaMath
中System
就是这种情况。)以任何方式实例化它们都是没有意义的。
在 C# 中,将类设为静态会使其隐含地成为最终/密封和抽象。在 Java 中,没有这样的关键字,您不能将类设为最终类和抽象类。因此,如果您有这样一个实用程序类,您会将其设为 final 并给它一个从未调用过的私有构造函数。
当您希望此类不能从外部初始化时使用
私有构造函数
用
例 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 类中,所有方法都是静态的,因此不需要创建其对象,因此在这种情况下使用私有构造函数
您可能需要私有构造函数的一些原因:
为了防止在对象之外实例化,在以下情况下:
单身人士
工厂方法
仅静态方法(实用程序)类
仅常量类
你也可以参考这段代码:
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;
}
}
作为其他答案的补充:
如果要创建单例类,需要隐藏构造函数,所以只能在内部调用。
恕我直言,一些用法是
- (辛格尔顿)
- 从另一个构造函数..
您可能不希望该类的用户直接实例化它,而是使用方便的静态方法代替,对于一个非常人为的构建器示例:
public FooBuilder {
private FooBuilder(FooBar bar) {
...
}
public static FooBuilder using(FooBar bar) {
return new FooBuilder(bar);
}
}
然后通过调用静态方法来使用它:
FooBuilder.using(bar) // further chained methods etc...
私有构造函数的另一个用途是确保仅存在一组有限的类实例。
例如:
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 枚举所取代。
当您不希望某个特定类被实例化时。
以下是私有构造函数的一些用途。
- 能够设计单例模式(所有对象之间仅共享对象的一个实例)。
2.限制实例创建的数量。
3.防止子类化。