Java双括号初始化

3

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

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

Into:

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

第二个示例会引发以下Eclipse警告:
可序列化的类未声明类型为long的静态final serialVersionUID字段。
我认为这些代码示例应该是等价的,有什么区别?

4
它们绝对不是等价的,它们非常不同。SO上有很多关于双括号初始化的先前问题。 - skaffman
@duffymo,你在这件事上完全错了。 - Irfy
1
你为什么要决定以这种方式“重构”你的原始示例?双括号初始化并不是一个广泛使用的做法!为什么不让Req的构造函数接受那些数据:Req req = new Req(x, y, z); - Richard Walton
@skaffman 谢谢。我对这个概念感到困惑。 - Adam Matan
2
@Irly,是的,我完全错了。我会撤回那些评论。 - duffymo
2个回答

6
第二种方法创建一个匿名子类,并使用未命名的初始化器进行初始化。如果Req是可序列化的,则它的任何子类都应该定义一个serialVersionUID

2
如果基类实现了java.io.Serializable,则子类应该有一个serialVersionUID。内部类不应该可序列化。
如果您计划将此代码创建的对象公开给其他可能想要序列化数据的代码,请勿使用双大括号语法(我认为您可以在writeReplace中使用它,但这会有点丑陋)。如果您确定您的代码不会与序列化接触,请在最广泛的上下文中加上@SuppressWarnings("serial")。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接