私有构造函数在java中有什么用
我想知道私有构造函数在java中是如何有用的。 这是在java中使用私有构造函数的不同方法。
私有构造函数当然不能限制类的实例化。
实际上私有构造函数的使用是在Singleton Pattern中。 这是一个例子
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溢出答案
Java中的构造函数可以是私有的吗?
在类中创建私有构造函数有什么用?
私人建设者
如果您希望此类不能从外部进行初始化,则使用私有构造函数
用途
案例1:创建sington类时
public class SingletonClass { public static SingletonClass singletonClass; private SingletonClass() { } public static SingletonClass getInstance() { if(singletonClass == null) { singletonClass = new SingletonClass(); } return singletonClass; } }
在这种情况下,只有初始化由getInstance方法完成。 没有人可以在外面创建Single of SingletonClass表单。
情况2:当你不想要像util类中的任何对象实例时
public final class Util { private Util() { } }
在util类中,所有方法都是静态的,因此不需要创建其对象,因此在这种情况下使用私有构造函数
正如其他提到的答案,常见用途包括单例模式 ,内部构造函数链接以及另外一个:
Java不支持C#中的内容(例如)被称为“静态类” – 换句话说, 实用程序类 。 实用程序类是一个辅助类,它应该只包含静态成员。 ( Math
和System
就是Java中的这种情况。)以任何方式实例化它们都没有意义。
在C#中,使类静态使其隐式地为final / sealed和abstract。 在Java中,没有这样的关键字,你不能使类最终和抽象。 所以,如果你有这样一个实用程序类,你可以使它成为最终的并给它一个永远不会被调用的私有构造函数。
使用私有构造函数会阻止它由对象外部的任何东西创建。 这通常用于单例模式,它试图确保只存在一个类的实例。
此链接还提供了一些很好的描述……
您可能需要私有构造函数的一些原因:
在以下情况下,为了防止对象外部的实例化:
-
独生子
-
工厂方法
-
static-methods-only(实用程序)类
-
常量类
您也可以参考以下代码:
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枚举取代。