Java中的构造函数可以是私有的吗?
一个构造函数可以是私有的吗? 私人构造函数如何有用?
是的,构造函数可以是私有的。 这有不同的用途。 一个这样的用途是单身devise反模式 ,我会build议您不要使用。 另一个更合理的用途是委托构造函数。 你可以有一个构造函数,这个构造函数有很多不同的选项,这些选项实际上是一个实现细节,所以你把它设置成私有的,然后你剩下的构造函数就委托给它了。
作为委托构造函数的一个例子,下面的类允许你保存一个值和一个types,但是它只允许你为types的一个子集做这个,所以需要使得通用构造函数是私有的,以确保只有被允许的types被使用。 通用的私有构造函数有助于代码重用。
public class MyClass { private final String value; private final String type; public MyClass(int x){ this(Integer.toString(x), "int"); } public MyClass(boolean x){ this(Boolean.toString(x), "boolean"); } public String toString(){ return value; } public String getType(){ return type; } private MyClass(String value, String type){ this.value = value; this.type = type; } }
编辑
从几年后看这个答案,我想指出,这个答案既不完整,也有点极端。 单身人士的确是一种反模式,一般应尽可能避免; 然而,除了单例之外,私有构造函数还有许多用途,我的答案只有一个。
为了让更多的情况下使用私有构造函数:
-
创build一个无关紧要的类,它只是一个相关静态函数的集合(这基本上是一个单例,但是如果它是无状态的,静态函数严格依赖于参数而不是类的状态,那么这不是一种不合理的方法早期的自我似乎表明,虽然使用dependency injection的接口通常会使实现需要更多数量的依赖关系或其他forms的上下文时更容易维护API)。
-
当有多种不同的方法来创build对象时,一个私有构造函数可以使得理解构造它的不同方式变得更容易(比如,对你的
new ArrayList(5)
或ArrayList.createWithCapacity(5)
,ArrayList.createWithContents(5)
更可读ArrayList.createWithContents(5)
,ArrayList.createWithInitialSize(5)
)。 换句话说,一个私有的构造函数允许你提供工厂函数的名字更容易理解,然后使构造函数保密,这样可以确保人们只使用更明显的名字。 这也是通常与build造者模式一起使用的 。 例如:MyClass myVar = MyClass .newBuilder() .setOption1(option1) .setOption2(option2) .build();
我期望有人会提到这个(第二点),但..有三个私人构造函数的用法:
-
以防止在对象之外的实例化,在以下情况下:
- 独生子
- 工厂方法
- 仅用于静态方法(实用程序)类
- 只有常量的类
。
-
以防止分stream(延伸)。 如果你只有一个私有的构造函数,没有类可以扩展你的类,因为它不能调用
super()
构造函数。 这是final
一种同义词 -
重载构造函数 – 由于重载方法和构造函数,有些可能是私有的,有些是公共的。 特别是当你在你的构造函数中有一个非公共类时,你可以创build一个公共构造函数来创build该类的一个实例,然后把它传递给一个私有的构造函数。
是的,它可以。 一个私有的构造函数将会阻止这个类被实例化,或者因为构造只发生在内部,例如Factory模式。 在这里看到更多的信息。
是。
这样就可以控制类如何实例化。 如果你使构造函数是私有的,然后创build一个可见的构造函数方法来返回类的实例,你可以做一些事情,比如限制创build数量(通常保证只有一个实例)或者回收实例或者其他与构build相关的任务。
做new x()
永远不会返回null
,但是使用工厂模式,你可以返回null
,甚至返回不同的子types。
您也可以将它用于没有实例成员或属性的类,只是静态的类(如在实用程序函数类中)。
那么,如果一个类中的所有方法都是静态的,那么私有构造函数是个好主意。
Java中的私有构造函数可以定义为以下原因
-
为了控制Java对象的实例,它不允许你创build一个对象的实例。
-
它不会允许类被分类
-
这在实现单例模式时有一个特别的优点,使用了私有contstructors并且控制了为整个应用程序创build实例。
-
当你想拥有一个定义了所有常量的类并且不再需要它的实例时,那么我们将该类声明为私有构造函数。
您可能需要私有构造函数的一些原因:构造函数只能从类本身内部的静态工厂方法访问。 单身人士也可以属于这个类别。 一个实用程序类 ,只包含静态方法。
是。
私有构造函数用于防止实例初始化,例如您在java中使用的Math final类。 Singleton也使用私有构造函数
是的,类可以有一个私人的构造函数。 需要禁止从其他类访问构造函数,并在定义的类中保持访问。
为什么你想让你的类的对象只在内部创build? 这可以做任何原因,但一个可能的原因是你想实现一个单身人士。 单例是一种devise模式,只允许创build一个类的实例,这可以通过使用私有构造函数来实现。
是的,它被用来防止实例化,然后重写。 这是最常用的单身人士课程。
是的,构造函数可以是私有的。 一个私有构造函数阻止其他类实例化私有构造函数的例子
public class CustomHttpClient { private static HttpClient customHttpClient; /** A private Constructor prevents any other class from instantiating. */ private CustomHttpClient() { }}
是。 类可以有私有构造函数。 即使抽象类也可以有私有构造函数。
通过使构造函数是私有的,我们阻止了该类的实例化以及该类的子类化。
以下是私有构造函数的一些用法:
- 单身devise模式
- 限制实例创build的次数
- 为使用静态工厂方法创build对象创build有意义的名称
- 静态工具类或常量类
- 防止子类化
- Builder的devise模式 ,从而创build不可变的类
私有构造函数阻止调用者显式实例化类,在PrivateConstructor上查看更多信息
拥有一个私有构造函数的基本思想是通过JVM限制外部类的实例化,但是如果一个类有一个参数构造函数,那么它就会推断出一个实例是有意实例化的。
根据我的说法,我们可以将构造函数声明为私有的,我们也可以通过在类中声明构造函数然后返回类对象的静态方法来获得子类中的实例。 我们通过使用classname.method
name bcz将这个方法分类到子类,它是静态方法,我们将得到我们声明const的类的实例。