例如一个类:
//class1
class A {
private A() { } // why would I make it private?
public A(int) { } //why isn't it implicitly public?
}
//class2
class B {
public static void main(String[] args) {
//A a = new A();
}
}
构造函数实例化一个类,为什么它有访问修饰符? 是否有必要声明构造函数 private ?
的情况答案 0 :(得分:5)
构造函数实例化一个类,为什么它有访问修饰符?
可以使用修饰符,以便控制对象的构造位置。
是否存在我们必须将构造函数声明为私有的情况?
假设您有像
这样的工厂方法class A {
private A(int n) { }
public static A create(int n) {
return new A(n);
}
}
或者你有一个应该直接调用的共享构造函数。
class B {
public B(int n) {
this(n, "");
}
public B(String str) {
this(0, str);
}
private B(int n, String str) { }
}
或者你有一个单身人士
final class Singleton {
Singleton INSTANCE = new Singleton();
private Singleton() { }
}
但我更喜欢使用enum
,其private
构造函数。
enum Singleton {
INSTANCE;
}
或者你有一个实用工具类
final class Utils {
private Utils() { /* don't create one */ }
public static int method(int n) { }
}
但是我喜欢在这种情况下使用枚举
enum Utils {
/* no instances */;
public static int method(int n) { }
}
注意:如果在final
类上使用私有构造函数,您仍然可以使用嵌套类或反射创建实例。如果您使用enum
,则无法轻易/意外地创建实例。
警告:您可以使用enum
Unsafe
的实例
请注意enum
中的构造函数必须为private
class BuySell {
BUY(+1), SELL(-1);
private BuySell(int dir) { }
}
您不必明确地private
,因为这是默认设置。
答案 1 :(得分:1)
应用于构造函数时,private修饰符的工作方式与应用于普通方法甚至实例变量的方式大致相同。使用private修饰符定义构造函数表示只允许本机类(如在定义私有构造函数的类中)创建类的实例,并且不允许其他调用者这样做。为什么人们想要使用私有构造函数有两个可能的原因 - 第一个是你根本不希望创建类的任何对象,第二个是你只希望在内部创建对象 - 如只在你班上创建。
私人建筑师的使用: -
1)私有构造函数可用于单例设计模式
2)私有构造函数可以阻止对象的创建
这也可能有助于Can a constructor in Java be private?私有构造函数的用例
答案 2 :(得分:0)
构造函数不负责创建object
的{{1}},这些构造函数只负责Class
成员变量。
这背后有各种各样的原因。其中最受欢迎的原因之一是initialize
。
design-Pattern
为什么要使用私有构造函数?
如果你想创建一个类//class1
class A {
private A() { } // why would I make it private?
}
,那么你的构造函数必须是singleton
。那么只有这样才能使一个单一的分类。