为什么在这里someVal
的初始化没有死代码警告?
public class DeadCode {
private int someVal = 0;
public DeadCode(int someVal) {
this.someVal = someVal;
}
public int getSomeVal() {
return someVal;
}
public void setSomeVal(int someVal) {
this.someVal = someVal;
}
}
应该由Java编译器获取死代码并发出警告。但这已经死了两次,并且顺利通过。
死了两次,因为
Java自动将实例字段初始化为
0
或等效值;someVal
的值必须先写入,然后才能读取。我意识到编译器可以根据需要取消分配,但是(按定义)所有无效代码都是如此。
如果在无效代码和无效代码之间做出区分,那么我希望
分配给变量
someVal
无效。如果我写的话我会得到的
someVal = someVal;
在我的代码中。但是我也不明白。
在任何情况下,维基百科都将dead code elimination视为对程序结果没有影响的代码删除。这肯定是一个例子。
最佳答案
我认为真正的答案是,很多人会发现该代码很烦人的警告。
但是,从技术上讲,初始化程序不构成无效代码,因为原则上可以在不正确同步的多线程程序中观察其效果。