2013-07-13 60 views
0

我定義了這段代碼。爲什麼這個靜態變量有時候會在類中變成空嗎?

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

你沒有申報instance'的'類型。 – mattbdean

+5

您需要同步getInstance()方法。 – EJP

+0

非常好的一點。它將只保證一個實例。 –

回答

1

我試圖做一個類似的東西,而回類之間保持數據,我終於有Enum

去嘗試是這樣的吧?

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); 
    } 
} 

如果你這樣做,你不會真的需要在枚舉功能,因爲你可能只是做

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

這是我在java中使用枚舉的非常困惑的部分。那麼枚舉和類之間有什麼區別?是否要初始化? –

+0

使用枚舉時,只允許創建一個實例,而這通常是在啓動程序時完成的。類和枚舉之間的區別在於一個類可以被多次實例化(xxx =新的AAA();),除非你專門製作它,所以你只能創建一個實例。 簡而言之,枚舉類型只是一種更清潔和更簡單的方法,可用於創建可用於跨其他類共享數據,信息甚至方法的類的單個實例。 (這是從我的理解,但我可能在某些部分是錯的) –

+0

感謝您的解釋。可能還有更多,但這是最重要的想法。 –

相關問題