建设者总是必须公开吗?

Has*_*eon 50 java oop constructor design-patterns access-modifiers

我的第一个问题是 -

   class Explain() {
        public Explain() {
      }
   }
Run Code Online (Sandbox Code Playgroud)

构造函数是否应始终声明为公共?

如果我创建一个private构造函数怎么办?

我总是看到构造函数是隐含的public.那么为什么private构造函数有用呢?或者根本没用.因为没有人可以调用它,或者从不创建对象(因为private构造函数)!这是我的第二个问题.

Dha*_*uka 78

不,构造函数可以是public,private,protecteddefault(没有访问修饰符的话).

制造东西private 并不意味着没有人可以访问它.这只意味着班上没有人可以访问它.所以private构造函数也很有用.

private构造函数的一个用途是提供单例类.单例类是将对象创建的数量限制为一个的类.使用private构造函数,我们可以确保一次只能创建一个对象.

示例 -

public class Database {

    private static Database singleObject;
    private int record;
    private String name;

    private Database(String n) {
        name = n;
        record = 0;
    }

    public static synchronized Database getInstance(String n) {
        if (singleObject == null) {
            singleObject = new Database(n);
        }

        return singleObject;
    }

    public void doSomething() {
        System.out.println("Hello StackOverflow.");
    }

    public String getName() {
        return name;
    }
}
Run Code Online (Sandbox Code Playgroud)

有关 访问修饰符的更多信息.

  • @TomWright这不是工厂方法,而是[builder模式](https://en.wikipedia.org/?title=Builder_pattern)经常使用私有构造函数. (7认同)
  • 你的实现`getInstance(){if(database == null){database = new Database(); 返回数据库; ``不是线程安全的:两个(或更多)线程可以创建自己的`Database`实例,并且可能最终使用相同或不同的实例,具体取决于退出的顺序. (5认同)
  • `private`构造函数不仅提供单例.它提供所有类型的使用模式,其中实现希望完全控制实例创建.请注意,所有`enum`都隐含了`private`构造函数...... (2认同)
  • @CiaPan整个`getInstance()`方法是同步的,所以它会阻塞重复的调用者,直到第一次完成,确保只创建一个`Database`实例. (2认同)

Ana*_*mar 10

是的,构造函数可以具有任何访问说明符/访问修饰符.

私有构造函数对于创建singleton类很有用.

Singleton - 单例类是一个只能在运行时创建单个对象的类(每个JVM).

单例类的一个简单例子是 -

class Ex {
    private static Ex instance;
    int a;
    private Ex() {
        a = 10;
    }
    public static Ex getInstance() {
        if(instance == null) {
            instance = new Ex();
        }
        return instance;
    }
}
Run Code Online (Sandbox Code Playgroud)

注意,对于上面的类,获取对象(在此类之外)的唯一方法是调用getInstance()函数,该函数只创建一个实例并继续返回该实例.

另请注意,这不是线程安全的.

  • 请注意,这不是线程安全的. (7认同)

Alp*_*Alp 7

构造函数可以是公共的,默认的或私有的,这完全取决于你想用它做什么.

例如,如果要定义Singleton类,则最好隐藏(意味着将其设置为私有,以便它仅对其所属的类可用)构造函数,以防止其他类随意实例化您的类.

您可能希望将其声明为默认值,例如,用于测试目的,以便同一个包中的测试用例可以访问它.

更多详细信息可以在这里找到


小智 5

没有规则将构造函数公开.通常我们将它定义为public只是因为我们想要从其他类中实例化它.

私有构造函数意味着"除了我,我不会让任何人创建我的实例".所以通常你会喜欢有单身模式.

以下是JDK中使用私有构造函数的类.

public class Runtime {
    private static Runtime currentRuntime = new Runtime();

    public static Runtime getRuntime() {
        return currentRuntime;
    }

    // Don't let anyone else instantiate this class
    private Runtime() {
    }
}
Run Code Online (Sandbox Code Playgroud)


Nit*_*ani 5

不,构造函数可以使用任何访问修饰符,包括私有.(私有构造函数意味着只有类本身的代码可以实例化该类型的对象,因此如果私有构造函数类想要允许使用该类的实例,则该类必须提供允许访问的静态方法或变量从类中创建的实例.)

class Alpha {
   static String s = " ";
   protected Alpha() { s += "alpha "; }
 }
 class SubAlpha extends Alpha {
   private SubAlpha() { s += "sub "; }
 }
 public class SubSubAlpha extends Alpha {
   private SubSubAlpha() { s += "subsub "; }
   public static void main(String[] args) {
     new SubSubAlpha();
     System.out.println(s);
   }
 }
Run Code Online (Sandbox Code Playgroud)

上述计划的输出将是

alpha子包