【发布时间】:2016-08-13 08:10:37
【问题描述】:
java util Collections 类offers 围绕任何现有列表创建“不可修改”装饰器。但我们都知道(或在某些时候很难学习);它实际上只是最初传递给该调用的列表周围的装饰器。装饰列表不能更改;但是如果修改了“原始”列表,它将在幕后发生变化。
现在假设我有一些类似的课程
class Whatever {
private final List<IDontCare> someElements;
public Whatever(List<IDontCare> incomingElements) {
someElements = unmodifiableCopyOf(incomingElements);
那个简单的类想要使用传入数据的真正不可修改的副本。好主意 - 但似乎没有干净/通用的方法来实现该方法unmodifiableCopyOf()。
可以想到:
- 使用“clone()”创建一个副本...不幸的是,“可见”clone() 仅存在于具体实现中,例如 ArrayList;但如果我只知道“它是实现列表的东西”……好吧;我无法克隆(很好地解释了here)
- 只需创建一个“中间容器”;像 new ArrayList(incomingElements) 并具有“装饰”;但是如果incomingElements 是一个链表呢?
- 使用其他一些库,例如提供"A high-performance, immutable, random-access List implementation" 的 Guava。但好吧,Guava 在我这里不是一个选择(我们几乎仅限于我们自己的库和一些 Apache 公共资源)。
Tl;dr:对于这个问题,真的没有“通用”解决方案(依靠“标准库”)给我一个真正不可修改的集合吗?基于其他一些集合?
【问题讨论】:
-
好吧。两个问题/答案......都以间接的方式“回答”我的问题:因为潜在问题的唯一“解决方案”是“使用 google/guava 库。但这是隐含的;也可能意味着人们没有”不知道其他解决方案。这就是为什么我写下我的问题并说得很清楚。
-
这就是我没有投票关闭的原因;)。
标签: java collections clone