为什么在这里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视为对程序结果没有影响的代码删除。这肯定是一个例子。

最佳答案

我认为真正的答案是,很多人会发现该代码很烦人的警告。

但是,从技术上讲,初始化程序不构成无效代码,因为原则上可以在不正确同步的多线程程序中观察其效果。

09-11 18:55