Java 中的单例 class 个问题

Singleton class issues in Java

public class Singleton {
  private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
  }

  private Singleton() {
  }

  public static Singleton getInstance() {
    return SingletonHolder.INSTANCE;
  }

  public static void main(String args[]) {
    Singleton s = new Singleton();
    Singleton s2 = new Singleton();
  }
  }

基于 "Effective Java",单例 class 类似于上面的内容。

假设我们在这个 class 里面有一个 main。我们可以根据需要多次启动单例class,比如

Singleton s1=new Singleton();
Singleton s2=new Singleton();
Singleton s3=singleton.getInstance();
Singleton s4=singleton.getInstance();

单例class应该是class只能启动一次,但是如果我们在上面声明多个实例,编译器不会报错,为什么?

单例 class 应该是 class 只能被其他 class 实体实例化一次。这通常是通过私有构造函数来实现的。但是,私有构造函数无法阻止 class.

中的实例化

不过你应该阅读这个问题:What is an efficient way to implement a singleton pattern in Java?

如果你遵循 Joshua Bloch 的想法并使用枚举来实现你的单例,那么即使在 class.

中你也无法破坏单例契约。