为什么没有" int someVal = 0"对于一个被视为死代码的实例字段?

时间:2014-11-11 20:26:40

标签: java initialization compiler-warnings compiler-optimization dead-code

为什么我的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编译器应该接收死代码并发出警告;但这已经过去了两次,并顺利过关。

因为

而死了两次
  1. Java 自动将实例字段初始化为0或等效字段;
  2. 无法在不写入的情况下读取someVal的值。
  3. 我意识到编译器可以根据需要忽略赋值,但所有死代码都是真的(按照定义)。

    如果死代码与没有效果的代码之间存在区别,那么我希望

      

    变量someVal的赋值无效。

    这就是我写的

    someVal = someVal;
    

    在我的代码中。但是,我也没有这样做。

    在任何情况下,维基百科都将dead code elimination视为删除对程序结果没有影响的代码;这肯定就是这种情况。

2 个答案:

答案 0 :(得分:3)

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

虽然技术性,但初始化程序并不构成死代码,因为原则上它可以在不正确同步的多线程程序中观察到。

答案 1 :(得分:0)

整数字段是一个简单的用例。如果你有类似的东西怎么办,请注意无参数构造函数:

public class DeadCode {

    private List<Integer> someVal = new ArrayList<>();

    public DeadCode() {
    }

    public DeadCode(Iterable<Integer> someVal) {
        this.someVal.addAll(someVal);
    }

    public Iterable<Integer> getSomeVal() {
        return someVal;
    }

    public void addSomeVal(int someVal) {
        this.someVal.add(someVal);
    }
}

你必须创建一个列表,是的,你可以在构造函数中完成它现在编译器需要更加智能,以便能够确定在哪些情况下初始化字段是浪费。我猜他们选择了一致而直截了当的行为。