用于静态最终变量的SerialVersionUID字段

时间:2012-03-26 08:55:40

标签: eclipse gwt

为了将整数转换为枚举(在json文件中),我声明了一些像这样的HashMaps:

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

现在eclipse给了我以下警告:

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

我已经找到错误消息here的一个很好的解释。但是我不知道GWT是怎么回事。 GWT在任何地方使用SerialVersionUID,还是实际上是由closur编译器删除的?据我所知,它不是必需的。

1 个答案:

答案 0 :(得分:1)

serialVersionUID仅用于Java序列化(使用JVM Serializable契约),这在GWT中是非常明显的。

这意味着你可以安全地忽略警告;你还可以安全地添加一个serialVersionUID来安抚Eclipse,因为它将被编译器修剪。
(我相信您也可以配置Eclipse,因此它不会生成警告)

此外,您不应该以这种方式初始化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:     final static Map getType = ImmutableMap.builder()        .put(1,Types.TYPE1)        .put(1,Types.TYPE2)        ...        .build();

更好的是,如果您的整数值使用枚举常量的声明顺序映射,您只需使用Enum#values()而不是map:

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