Java 中不可变集合的公共类型 [已关闭]

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

我的问题与Java没有公共不可变集合有关,也可以应用于实用方法的返回类型,如

List.of()
Set.of()
Map.of()
等。

  1. 为什么这些类型不是
    public
  2. 未来的版本有可能发生这种情况吗?或者Java只是在Collection框架中引入公共不可变类型?

例如,如果

java.util.ImmutableCollections$List12
可供使用(例如,在像
ImmutableList
这样的用户友好包装器中,它会
extends List
),那么它可以用于声明具有不可变列表的
record
,而无需指定规范和/或紧凑的构造函数,并消除对任何外部库的需要来保持域对象真正不可变。

public record MyRecord(ImmutableList<MyType> list) {}

编辑

在与 Kotlin 竞争时,Java 需要这样的东西 - 要么重新设计这些内部类型,要么创建新的类型,即

ImmutableList extends List

参考:在 Java 记录中强制执行不可变集合?

抄送:@BrianGoetz

java immutability java-record immutable-collections
1个回答
-2
投票

您提到的类,例如

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 类或功能。

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