Java双括号初始化
我已重构了以下对象初始化:Java双括号初始化,java,eclipse,double-brace-initialize,Java,Eclipse,Double Brace Initialize,我已重构了以下对象初始化: Req r=new Req(); r、 集合f1(“A”); r、 集合f2(123); r、 第3组(123.456); 进入: Req r=new Req(){{ 集合f1(“A”); 集合f2(123); 套件f3(123.456) }}; 第二个示例引发以下Eclipse警告: serializable类不声明long类型的静态最终SerialVersionId字段 我认为这些代码示例应该是等效的-有什么区别吗?第二个示例创建一个匿名子类,并用一个未命名的
Req r=new Req();
r、 集合f1(“A”);
r、 集合f2(123);
r、 第3组(123.456);
进入:
Req r=new Req(){{
集合f1(“A”);
集合f2(123);
套件f3(123.456)
}};
第二个示例引发以下Eclipse警告:
serializable类不声明long类型的静态最终SerialVersionId字段
我认为这些代码示例应该是等效的-有什么区别吗?第二个示例创建一个匿名子类,并用一个未命名的初始化器初始化它。如果
Req
是可序列化的,那么它的任何子类都是可序列化的,因此应该定义一个serialVersionUID
如果基类实现java.io.serializable
,那么子类应该有一个serialVersionUID
。内部类不应可序列化
如果您计划将此代码创建的对象公开给可能希望序列化数据的其他代码,请不要使用双大括号习惯用法(我想您可以将其与
writeReplace
一起使用,但这有点难看)。如果您确定您的代码不会与序列化接触,请在尽可能广泛的上下文中粘贴@SuppressWarnings(“serial”)
。这两个绝对不同,它们非常不同。关于双大括号初始化的问题很多。@duffymo你在这一点上完全错了。你为什么决定用这种方式“重构”你的原始示例?!双括号init并不是一种广泛使用的实践!让Req的构造函数接受该数据怎么样:Req Req=newreq(x,y,z)@斯卡夫曼,谢谢。我对这个概念感到困惑。@Irly,是的,我完全错了。我将撤销这些评论。