【问题标题】:Java static initializer seems to be redundantJava 静态初始化器似乎是多余的
【发布时间】:2012-04-17 15:14:28
【问题描述】:

所以我确实阅读了从该线程执行静态初始化程序的内容和时间。 Static initializer in Java。但是我遇到了一些其他人编写的旧代码,似乎无法理解他为什么会这样使用它。

我的班级:

public class ClassA extends Thread {
  .... private vars ....

  private static Config config;

  static {
    config = null;
  }

  public ClassA(Config config) {
    ClassA.config = config;
  }
}

他为什么不这样做?

public class ClassA extends Thread {
  .... private vars ....

  private static Config config = null;

  public ClassA(Config config) {
    ClassA.config = config;
  }
}

我知道静态初始化器会在类被重新生成时被调用,所以它设置 config => null,而如果我不使用静态初始化器,实例变量会在构造函数之前和超级之后获得初始化器。那么这两个班级不会做同样的事情吗?

【问题讨论】:

    标签: java initialization


    【解决方案1】:

    这些类做同样的事情,但更复杂的静态初始化器不能总是在一行中完成。

    【讨论】:

    • 所以可以肯定地说我可以使用第二个实现并且不会改变任何功能。
    • 也许该类的作者先进行了一些更复杂的初始化,然后在没有删除静态初始化程序的情况下将其删除。但这只是一个猜测。无论如何,你的答案是准确和正确的 (+1)。
    • @Churk 在这种特殊情况下?是的。
    • @MichaelSchmeißer,谢谢,我刚刚查看了源版本控制,是的,这个静态初始化器更复杂,这解释了它存在的原因。
    【解决方案2】:

    第一个示例中的静态初始化程序不会对该类的行为产生任何影响。您可以将其完全删除,不会有任何改变。

    【讨论】:

      【解决方案3】:

      为什么我写 x = x + 1 而不是 x++ ?没有什么特别的原因,我就是这样做的。我认为这里是一样的,因为 2 基本上是相同的,这并不重要。另一方面,如果将来某个时候需要更复杂的初始化,也许他不能在那一行代码中做到这一点。

      【讨论】:

        【解决方案4】:

        静态块只会在类加载时初始化一次配置,无论有多少 ClassA 实例。

        无论哪种解决方案都无所谓,这只是技术问题,我见过人们同时使用这两种解决方案。

        【讨论】:

          【解决方案5】:

          两者都在做完全相同的事情,这是设计选择的问题。

          【讨论】:

            猜你喜欢
            • 2023-03-26
            • 1970-01-01
            • 2012-03-30
            • 2010-12-11
            • 1970-01-01
            • 2014-10-06
            • 1970-01-01
            • 1970-01-01
            • 2010-12-11
            相关资源
            最近更新 更多