2013-07-13 4 views
0

이 코드를 정의했습니다.때때로이 클래스의 static 변수가 null입니까?

public class AAA { 
    public static final Map<String, String> gList = new HashMap<> {{ 
     put("xxx", "xxx"); 
     put .... 
    }}; 
    public static AAA instance; 
    public static AAA getInstance() { 
     if (instance == null) 
      instance = new AAA(); 
     return instance; 
    } 

    public String calledFunc(String k) { 
     return gList.get(k);  
    } 
} 

public class BBB { 
    ... 
    public void callingFunc(String k) { 
     AAA.getInstance().calledFunc(k); // <= NULL pointer some time 
    } 
} 

메모리 할당이 실패하거나 일부가 해제 될 것이기 때문입니다. 내 코드에서 잘못된 점을 이해하지 마십시오. 어쩌면 이것은 안정적인 방법으로 초기화 할 수 없습니다.

+0

을 할 수 있기 때문에

public enum AAA { INSTANCE; public static final Map<String, String> gList = new HashMap<> {{ put("xxx", "xxx"); put .... }}; public String calledFunc(String k) { return gList.get(k); } } 

, 당신은 정말 당신은 instance''의 유형을 선언하지 않은 열거의 기능이 필요하지 않을 것입니다. – mattbdean

+5

getInstance() 메소드를 동기화해야합니다. – EJP

+0

아주 좋은 지적. 하나의 인스턴스만을 보장합니다. –

답변

1

내가 클래스 사이에 데이터를 채 다시이 잠시와 비슷한 일을 시도, 나는 결국이 아마 같은 것을 시도해보십시오 Enum

와 함께 갔다? 당신이 이런 짓을하면 그냥

public class BBB { 
    ... 
    public void callingFunc(String k) { 
     AAA.gList.get(k); // <= NULL pointer some time 
    } 
} 
+0

열거 형을 사용하는 자바에서이 부분이 꽤 혼란 스럽습니다. 열거 형과 클래스 형의 차이점은 무엇일까요? 초기화하는 방법은 무엇입니까? –

+0

열거 형을 사용할 때 하나의 인스턴스 만 만들 수 있으며 이는 일반적으로 프로그램을 시작할 때 완료됩니다. 클래스와 열거 형의 차이점은 클래스를 하나만 인스턴스를 만들 수 있도록 특별히 만들지 않는 한 클래스를 여러 번 인스턴스화 할 수 있다는 것입니다 (xxx = new AAA();). 간단히 말해서 열거 형은 데이터, 정보 및 다른 클래스의 메서드를 공유하는 데 사용할 수있는 클래스의 단일 인스턴스를 만드는 데 더 단순하고 간편한 방법입니다. (그건 내 이해에서 나온 것이지만 일부 부분에서 잘못 될 수 있습니다) –

+0

설명해 주셔서 감사합니다. 더 많은 것이있을 수 있지만 이것은 가장 중요한 아이디어입니다. –

관련 문제