『Java解惑』『パズル52:合計数の冗談』についての引用討論
static final class StaticCheck {
static {
getValue();
}
private static int value;
public StaticCheck() {
super();
System.out.println("check value:" + getValue());
}
private static boolean isInit = false;
private static int getValue() {
if (isInit) {
return value;
}
for (int i = 0; i < 100; i++) {
value += i;
}
return value;
}
}
mainメソッド:
public static void main(String...args) {
new StaticCheck();
}
これは本の中の本来の意味と同じコードです.結果は、言うまでもなく、みんなも推測しました.
getValueメソッドが2回実行されました.
しかし、私は少し変更して、結果はまた正しいようです.
static final class StaticCheck {
static {
getValue();
}
private static int value = 0;
public StaticCheck() {
super();
System.out.println("check value:" + getValue());
}
private static boolean isInit = false;
private static int getValue() {
if (isInit) {
return value;
}
for (int i = 0; i < 100; i++) {
value += i;
}
return value;
}
}
違いはここにあります.
private static int value = 0;
私はまたvalueに値を割り当てました.
したがって,getValueは2回実行したが,value,isInitの2つの変数により,2回目の実行までに再初期化された.だから、結果はまた正しい.
もし、問題の隠蔽性といえば、個人的には、実行結果が予想に合っているため、後者のほうが発見しにくいと思います.しかし、いつか誰かがコードを小さな修正をしていたら.
例:
private static int value = 0;
static {
getValue();
}
それは惨めだ!!!