2009-12-18 90 views
2
public static List<Long> abc = new ArrayList<Long>(){{ //Asks for SerialVersionUID 
     abc.add(5L); 
     abc.add(7L); 
    }}; 

public static List<Long> abc = new ArrayList<Long>();//Does not need SerialVersionUID 
    static{ 
     abc.add(5L); 
     abc.add(7L); 
    } 
+2

这将回答你的问题,它是相同的http://stackoverflow.com/questions/924285/efficiency-of-java-double-brace-initialization – valli 2009-12-18 06:26:36

+1

ack!在这两个例子中,你正在创建一个公共静态*可修改*列表 - 非常糟糕。 – 2009-12-18 08:00:01

+1

@Kevin在你创建一个公共静态可修改列表的例子中,你是什么意思。什么是替代方案? – DKSRathore 2009-12-18 11:59:28

回答

5

在第二个示例中,您正在实例化一个已定义为serialVersionUID(即ArrayList)的类。

在第一个示例中,您定义了一个匿名的子类ArrayList,并且您的子类需要定义自己的serialVersionUID。双括号初始化实际上定义了一个匿名类并不总是显而易见的。

3

因为在第一个例子中,你通过“double-brace initialization”创建了ArrayList的匿名子类,并且ArrayList实现了Serializable接口。 SerialVersionUID用于反序列化,尽管不是绝对必要的,但提供一个是很好的做法。您的IDE可能配置为报告这些警告。

在你的第二个例子中,你并没有创建一个ArrayList的匿名子类,只是实例化一个并调用它的方法。