private static Object myVar2;
static{
myVar2 = new Object();
}
을 initilized 정적 변수
private static Object myVar2;
static{
myVar2 = new Object();
}
을 initilized 정적 변수
당신은 두 번째 초기화의 경우 더 사용할 수 있습니다 귀하의 정적 및 어쩌면 또한 최종 개체가 더 복잡합니다. 당신의 예에서
예컨대 :
static final MyClass something;
static {
Config conf=SettingsManager.getSettings();
MyClass obj=MyClassFactory.getInstance(conf);
obj.setVodoo(true);
something=obj;
}
는 차이가없고 컴파일 된 바이트 코드는 정확히 또는 매우 거의 같은 끝날 것입니다. 정적 이니셜 라이저는 유용하지만 더 자주 오용됩니다. 단일 정적 필드를 채우는 것이 목표 인 경우 초기화 된 개체를 반환하고 정적 필드 선언 내에서 해당 메서드를 호출하는 정적 메서드 을 작성합니다.
정적 개체를 만드는 것이 더 복잡한 경우 정적 초기화 블록을 사용할 수 있습니다. 예를 들어, setter를 호출해야하거나 설정중인 보조 중간 객체가 필요할 수 있습니다.
static {
SomeConfig config = new SomeConfig();
config.setMaxSize(10);
config.setMinSize(1);
YourObject object = new YourObject(config);
}
두 클래스 파일의 내용에 의해 분명 정확히 동일합니다
public class Test extends java.lang.Object{
public Test();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
static {};
Code:
0: new #2; //class java/lang/Object
3: dup
4: invokespecial #1; //Method java/lang/Object."<init>":()V
7: putstatic #3; //Field myVar2:Ljava/lang/Object;
10: return
}
당신은 어느 경우에 동일한 바이트 코드를 얻을 것이다. Test.java 파일에 위의 옵션을 넣어서 바이트 코드를 생성했습니다.
하나는 다른 하나보다 덜 장황합니다. 첫 번째 것을 사용할 수없는 경우에만 두 번째 것을 사용하십시오. –
정확히 차이가 없습니다. –