我的问题与Java没有公共不可变集合有关,也可以应用于实用方法的返回类型,如
List.of()
、Set.of()
、Map.of()
等。
public
?例如,如果
java.util.ImmutableCollections$List12
可供使用(例如,在像 ImmutableList
这样的用户友好包装器中,它会 extends List
),那么它可以用于声明具有不可变列表的 record
,而无需指定规范和/或紧凑的构造函数,并消除对任何外部库的需要来保持域对象真正不可变。
public record MyRecord(ImmutableList<MyType> list) {}
编辑
在与 Kotlin 竞争时,Java 需要这样的东西 - 要么重新设计这些内部类型,要么创建新的类型,即
ImmutableList extends List
。
抄送:@BrianGoetz
您提到的类,例如
ImmutableCollections$List12
,是Java平台的内部实现细节,它们不属于公共API的一部分。这些内部类并不适合开发人员直接使用,并且它们的 API 可能会在 Java 版本之间发生更改,恕不另行通知。
这些类不公开的原因是为了让 Java 开发团队能够灵活地更改内部实现,而不影响公共 API。通过将这些类保留在内部,Java 团队可以提高性能、修复错误或根据需要进行其他更改,而不会破坏依赖公共 API 的现有代码。
关于这些类在未来版本中公开的可能性,很难预测 Java API 的具体变化。然而,Java 的一般原则是提供稳定且定义良好的公共 API,同时允许内部实现改进的灵活性。
如果您对使用不可变集合感兴趣,您可能需要探索提供此类功能的第三方库。像 Guava 或 Apache Commons Collections 这样的库提供了带有公共 API 的不可变集合,您可以在代码中使用它们。
在您提供的示例中:
public record MyRecord(ImmutableList<MyType> list) {}
如果
ImmutableList
是第三方库,并且它提供了所需的不变性和功能,那么在记录声明中使用它是一种合理的方法。这样,您就可以实现所需的不变性,而无需依赖内部 Java 类或功能。