为什么我的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编译器应该接收死代码并发出警告;但这已经过去了两次,并顺利过关。
因为
而死了两次0
或等效字段; someVal
的值。我意识到编译器可以根据需要忽略赋值,但所有死代码都是真的(按照定义)。
如果死代码与没有效果的代码之间存在区别,那么我希望
变量
someVal
的赋值无效。
这就是我写的
someVal = someVal;
在我的代码中。但是,我也没有这样做。
在任何情况下,维基百科都将dead code elimination视为删除对程序结果没有影响的代码;这肯定就是这种情况。
答案 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);
}
}
你必须创建一个列表,是的,你可以在构造函数中完成它现在编译器需要更加智能,以便能够确定在哪些情况下初始化字段是浪费。我猜他们选择了一致而直截了当的行为。