Java:构造函数为什么具有访问修饰符?

时间:2016-04-10 07:12:49

标签: java constructor

例如一个类:

//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

的情况

3 个答案:

答案 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。那么只有这样才能使一个单一的分类。