给定一个带有列表字段的类:
public class A implements Serializable {
private final List<String> names;
public A(List<String> names) {
this.names = List.copyOf(names);
}
// ...
}
编译器发出警告,指出该字段不可序列化。
List.copyOf
返回的不可修改列表是可序列化的,所以实际上这不是问题。但我想摆脱警告 - 实现这个的最干净的方法是什么?
注意:当字段不需要不可修改时,我可以将其设为
ArrayList
(而不是 List
),并使用 new ArrayList(names)
(而不是 List.copyOf(names)
)复制构造函数中的名称。但(显然)该列表是可以修改的。
所以我想我的问题是:如何声明一个不可修改的可序列化列表?
Java 保证
List.of
和 List.copyOf
返回的列表是可序列化的(显然,如果它们的组件类型是可序列化的),所以你不需要做任何事情来使它们可序列化。问题是您将列表变量声明为 List
,并且不能保证可序列化(它不扩展 Serializable
),因此会发出警告。
除了在字段(或类)上添加
@SuppressWarnings("serial")
之外,没有其他方法可以处理此问题,因为您的实现知道它始终使用可序列化的实现。
wypieprz在注释中建议使用
Collections.unmodifiableList
并不是一个好的选择,因为虽然此方法返回的实际类型也实现了Serializable
,但实际的可序列化性取决于传入的列表是否可序列化。然后,无论如何,您都需要制作一个防御性副本(检查传入的列表是否实现了 Serializable
实际上是不够的,因为您自己可能会收到 Collections.unmodifiableList
的返回值)。如果您需要复印,使用 List.copyOf
是更好的选择。