如何在Java中声明不可修改的可序列化List

问题描述 投票:0回答:1

给定一个带有列表字段的类:

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 collections serializable
1个回答
0
投票

Java 保证

List.of
List.copyOf
返回的列表是可序列化的(显然,如果它们的组件类型是可序列化的),所以你不需要做任何事情来使它们可序列化。问题是您将列表变量声明为
List
,并且不能保证可序列化(它不扩展
Serializable
),因此会发出警告。

除了在字段(或类)上添加

@SuppressWarnings("serial")
之外,没有其他方法可以处理此问题,因为您的实现知道它始终使用可序列化的实现。

wypieprz在注释中建议使用

Collections.unmodifiableList
并不是一个好的选择,因为虽然此方法返回的实际类型也实现了
Serializable
,但实际的可序列化性取决于传入的列表是否可序列化。然后,无论如何,您都需要制作一个防御性副本(检查传入的列表是否实现了
Serializable
实际上是不够的,因为您自己可能会收到
Collections.unmodifiableList
的返回值)。如果您需要复印,使用
List.copyOf
是更好的选择。

© www.soinside.com 2019 - 2024. All rights reserved.