『Java解惑』『パズル52:合計数の冗談』についての引用討論

1832 ワード

	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();
		}

それは惨めだ!!!