java - 在构造函数中使用单例

标签 java

我有一个单例 Logger 类。

public class Logger {
  public static Logger INSTANCE = new Logger();

  private Logger() {
    ...
  }
}

我想在我的构造函数中记录一个新实例已创建。所以我的代码看起来像:

public class MyClass {
  public MyClass() {
    Logger.INSTANCE.log("MyClass created");
    ...
  }
}

我想知道这是否会破坏 MyClass 的静态实例。例如,如果我有:

public class MyOtherClass {
  private static MyClass myClass = new MyClass();
  ...
}

我担心这会由于未定义静态变量的初始化顺序而导致问题。因此,如果 myClassLogger.INSTANCE 之前被初始化,那么 myClass 的构造将会崩溃。是否有某种机制可以防止这种情况发生,或者在构造函数中使用静态变量本身就很危险?在这种情况下,有什么方法可以防止用户创建 MyClass 的静态实例吗?

最佳答案

public class Logger {
  public static Logger INSTANCE = new Logger();

  private Logger() {
    ...
  }
}

是语法糖

public class Logger {
  public static Logger INSTANCE;
  static {
      INSTANCE = new Logger();
  }

  private Logger() {
    ...
  }
}

静态 block 设置类的静态成员,并且is guaranteed to run before your class is used .

关于java - 在构造函数中使用单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31769880/

相关文章:

java - 引用父类(super class)如何使用子类方法

java - Java 8 中是否有一个类可以实现 "null-terminated"流而无需自己滚动?

java - GWT:如果未登录应用程序,静态 HTML 页面应重定向到 login.html

java - JOptionPane - 检查用户输入并防止在满足条件之前关闭

java - java中的GUI问题

java - 如何使用我自己的服务器在 Android 应用程序中设置 cloudboost?

java - Android savedInstanceState 总是返回 null

java - Eclipse 项目无法使用相对路径引用文件

java - Activiti 7 候选用户任务

java - QAF 的 JUnit 实现