2009-10-29 3 views
38

자바에서 클래스의 개인 정적 멤버를 초기화하는 방법.정적 변수 초기화 자바

하려고 다음

public class A { 
    private static B b = null; 
    public A() { 
     if (b == null) 
     b = new B(); 
    } 

    void f1() { 
     b.func(); 
    } 
} 

하지만 F1을() 클래스 A의 두 번째 객체를 생성 한 후 호출에

, 난 널 포인터 예외를 얻을.

+0

public constructor –

+0

ok typing 실수를 사용해야합니다. –

+1

어떤 코드 줄에서 널 포인터 예외가 발생합니까? –

답변

68

선호하는 방법을 사용하면 정적 이니셜 라이저 블록을 사용할 수 있습니다 :

private static final B a; 

static { 
    a = new B(); 
} 
+2

B의 생성자로 정적 이니셜 라이저 블록을 사용했습니다. 예외가 발생합니다. 여전히 같은 오류가 발생합니다. 라이브러리 함수에 대한 첫 번째 호출은 작동하지만 두 번째 호출은 작동하지 않습니다. –

+2

정적 멤버를 초기화하는 기본 방법은 실제 상황에 따라 다릅니다. 이 패턴을 통해 * 모든 * 정적 멤버를 만드는 소프트웨어는 응용 프로그램을 시작하는 동안 성능에 영향을줍니다. 평범하지 않은 상황에서 나는 그 이유 때문에 게으른 초기화 패턴을 선호한다. – rsp

+1

@rsp : 성능 문제가 있습니다. (시작시에는 아니지만 클래스가로드 될 때 올바른 것입니다. 동일 할 수도 있지만 반드시 같을 필요는 없습니다). 나는 정적 인 멤버를 초기화하는 이런 식으로 초기화를하는 것이 지연을 복잡하게 코드에 추가하는 것을 고려할 것이다 - 이것은 좋은 이유를 제외하면 피해야한다. 성능이 그러한 이유 중 하나 일 수 있습니다. – sfussenegger

4

코드가 작동해야합니다. 정확한 코드를 올리시겠습니까?


당신은 또한 더 직접 초기화 할 수 있습니다 : (전에 언급 한 바와 같이) 정적 멤버 중 하나입니다

private static final B a = new B(); // consider making it final too 

또는 더 복잡한 초기화 코드를 초기화하는

public class A { 

     private static B b = new B(); 

     A() { 
     } 

     void f1() { 
     b.func(); 
     } 
    }