2012-12-01 1 views

답변

8

당신은 두 번째 초기화의 경우 더 사용할 수 있습니다 귀하의 정적 및 어쩌면 또한 최종 개체가 더 복잡합니다. 당신의 예에서

예컨대 :

static final MyClass something; 

static { 
    Config conf=SettingsManager.getSettings(); 
    MyClass obj=MyClassFactory.getInstance(conf); 
    obj.setVodoo(true); 
    something=obj; 
} 
6

는 차이가없고 컴파일 된 바이트 코드는 정확히 또는 매우 거의 같은 끝날 것입니다. 정적 이니셜 라이저는 유용하지만 더 자주 오용됩니다. 단일 정적 필드를 채우는 것이 목표 인 경우 초기화 된 개체를 반환하고 정적 필드 선언 내에서 해당 메서드를 호출하는 정적 메서드 을 작성합니다.

1

정적 개체를 만드는 것이 더 복잡한 경우 정적 초기화 블록을 사용할 수 있습니다. 예를 들어, setter를 호출해야하거나 설정중인 보조 중간 객체가 필요할 수 있습니다.

static { 
    SomeConfig config = new SomeConfig(); 
    config.setMaxSize(10); 
    config.setMinSize(1); 
    YourObject object = new YourObject(config); 
} 
0

두 클래스 파일의 내용에 의해 분명 정확히 동일합니다

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 파일에 위의 옵션을 넣어서 바이트 코드를 생성했습니다.