2012-03-26 112 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