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,谢谢你,我刚刚查看了源代码版本控制,是的,这个静态初始化器更复杂,这解释了它为什么会存在。