2012-03-26 113 views
0

對於一個整數轉換成一個枚舉(出一個JSON文件)的serialVersionUID領域,我宣佈一些包含HashMap是這樣的:靜態最終變量

final static HashMap<Integer, Types> getType = new HashMap<Integer, Types>() { 
    { 
     put(1, Types.TYPE1); 
     put(2, Types.TYPE2); 
     .... 
    } 
}; 

現在日食給了我以下警告:

The serializable class does not declare a static final serialVersionUID field of type long 

我已經找到了錯誤消息here的一個很好的解釋。但是我不知道GWT是如何實現的。 GWT是否在任何地方使用SerialVersionUID,還是實際上被closur編譯器刪除?據我看來,這是不需要的。

回答

1

serialVersionUID僅用於Java序列化(使用JVM Serializable合約),這顯然在GWT中不受支持。

這意味着您可以放心地忽略該警告;並且您還可以安全地添加一個serialVersionUID來安撫Eclipse,因爲它將被編譯器修剪。
(我相信你也可以配置Eclipse,因此不會產生警告)

而且,你不應該initialze你HashMap這種方式(即創建的HashMap一個匿名子類初始化本身在其初始化)。你最好使用一個靜態初始化:

final static Map<Integer, Types> getType; 
static { 
    getType = new HashMap<Integer, types>(); 
    getType.put(1, Types.TYPE1); 
    getType.put(2, Types.TYPE2); 
    ... 
    // you could even use Collections.unmodifiableMap here 
} 

或使用Guava's ImmutableMap: 最終靜態地圖的getType = ImmutableMap.builder() 。把(1,Types.TYPE1) 。把(1,類型。 TYPE2) ... .build();

更妙的是,如果你的整數值與映射枚舉常量聲明的順序,你可以簡單地用枚舉值#(),而不是圖:

Types typeFromInt(int i) { 
    return Types.values()[i]; 
} 
+0

感謝,ImmutableMap是正確的我想要的東西! Types.values()[I]; 對我不起作用,因爲數字不是從1到10,而是1,2,5,6 ......:/ – Stefan 2012-03-26 10:00:22