Java静态初始值设定项似乎是多余的

Java静态初始值设定项似乎是多余的,java,initialization,Java,Initialization,因此,我确实阅读了从这个线程执行静态初始化器的内容和时间。但是我遇到了一些别人写的旧代码,我似乎不明白他为什么会这样使用它 我的班级: public class ClassA extends Thread { .... private vars .... private static Config config; static { config = null; } public ClassA(Config config) { ClassA.config

因此,我确实阅读了从这个线程执行静态初始化器的内容和时间。但是我遇到了一些别人写的旧代码,我似乎不明白他为什么会这样使用它

我的班级:

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;
  }
}

我知道静态initalizer在类被重新调用时得到调用,因此它将config=>null设置为空,而如果我不使用静态initalizer,实例变量将在构造函数之前和超级之后得到initalizer。那么这两个类不是在做同样的事情吗?

这些类在做同样的事情,但是更复杂的静态初始值设定项不能总是在一行上完成。

第一个示例中的静态初始值设定项不会对该类的行为产生任何影响。你可以完全删除它,但什么都不会改变。

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

静态块在加载类时只初始化配置一次,不管有多少个ClassA实例


不管是哪种解决方案,这只是一个技术问题,我见过人们同时使用这两种解决方案。

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

因此可以肯定地说,我可以使用第二个实现,并且不会更改任何功能。可能该类的作者先进行了一些更复杂的初始化,然后删除了它,而没有删除静态初始值设定项。但这只是一个猜测。无论如何,你的答案是准确无误的(+1)。@Churk在这种情况下?是的。@MichaelSchmeißer,谢谢你,我刚刚查看了源代码版本控制,是的,这个静态初始化器更复杂,这解释了它为什么会存在。