为什么双括号初始化要求SerialVersionUID?

时间:2009-12-18 06:18:04

标签: java serialization

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 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

因为在您的第一个示例中,您通过“双括号初始化”创建了ArrayList的匿名子类,并且ArrayList实现了Serializable接口。 SerialVersionUID用于反序列化,提供一个虽然不是绝对必要,但它是一个很好的做法。您的IDE可能已配置为报告这些警告。

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