Java双支撑初始化

时间:2012-02-19 14:13:37

标签: java eclipse double-brace-initialize

我重构了以下对象初始化:

Req r = new Req();
r.set_f1("A");
r.set_f2(123);
r.set_f3(123.456);

分为:

Req r = new Req() {{
    set_f1("A");
    set_f2(123);
    set_f3(123.456)
}};

第二个示例引发了以下Eclipse警告:

  

serializable类不声明long

类型的静态最终serialVersionUID字段

我认为这些代码示例应该是等效的 - 有什么区别?

2 个答案:

答案 0 :(得分:6)

第二个创建一个匿名子类并使用未命名的初始化器初始化它。如果Req是可序列化的,那么它的任何子类都是,因此应该定义serialVersionUID

答案 1 :(得分:2)

如果基类实现java.io.Serializable,那么子类将具有serialVersionUID。内部类不应该是可序列化的。

如果您计划将此代码创建的对象暴露给可能想要序列化数据的其他代码,请不要使用双括号(我想您可以将其与writeReplace一起使用,但是这有点难看)如果您确定您的代码不会与serilisation接触,请在最广泛的背景下坚持@SuppressWarnings("serial")