compile-time_constant

compile-time_constant

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

package com.github.sejoung.codetest.singleton;

class OldSingleton {
//compile-time constant
final static String NAME = "OldSingleton";

final static String NAME = new String("OldSingleton");
final static OldSingleton INSTANCE = new OldSingleton();

private OldSingleton() {
System.out.println("hi");
}

}

위에 코드에서 아래의 변수를 선언하면 compile-time constant라고 하는데 컴파일 시점에 상수를 참조 하고 있는 값을 상수 내부의 값으로 바꿔준다.

1
2
3

final static String NAME = "OldSingleton";

그래서 아래의 코드를 찍어 보면

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

package com.github.sejoung.codetest.singleton;

public class SingletonTest {

public static void main(String[] args) {
System.out.println("1======================");
System.out.println(OldSingleton.NAME);
System.out.println("2======================");
OldSingleton oldSingleton1 = OldSingleton.INSTANCE;
System.out.println("3======================");
OldSingleton oldSingleton2 = OldSingleton.INSTANCE;
System.out.println("4======================");
System.out.println(oldSingleton1 == oldSingleton2);

}

}


아래 처럼 static 변수를 선언해서 가지고 와도 싱글톤 객체가 참조 되는 순간 new되는 것 처럼 보인다.

1
2
3
4
5
6
7
8

1======================
OldSingleton
2======================
hi
3======================
4======================

하지만 위에서 말했듯이 compile-time constant라서 정상인것처럼 보였지만 코드를 아래 처럼 변경 해주면

1
2
3

final static String NAME = new String("OldSingleton");

아래 처럼 OldSingleton.NAME 참조 되는 순간 객체가 생성 되는 것이 보인다.

1
2
3
4
5
6
7
1======================
hi
OldSingleton
2======================
3======================
4======================
true

참조