问题标签 [unmodifiable]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - java 集合的不可修改包装器是否使它们成为线程安全的?
我需要使 ArrayList 的 ArrayLists 线程安全。我也不能让客户对收藏进行更改。不可修改的包装器会使其线程安全,还是我需要在集合上使用两个包装器?
java - 如何创建一个深度不可修改的集合?
在从 getter 方法返回之前,我经常使集合字段不可修改:
但是如果上面的 X 本身就是一个列表,我想不出一种方便的方法:
上面的问题当然是,虽然客户端不能修改列表列表,但它可以从嵌入列表中添加/删除 Y 对象。
有什么想法吗?
c# - C# 中不可修改的列表
在 Java 中,可以使用 Collections#unmodifiableList() 方法从现有的 List 对象创建一个不可修改的列表。C# 中是否有任何对应物?我是该语言的新手,在 MSDN 文档中找不到类似的内容。
java - Collections.unmodifiableSet() 在 Java 中做了什么?
我可以看到它Collections.unmodifiableSet
返回给定集合的不可修改视图,但我不明白为什么我们不能只使用final
修饰符来完成此操作。
在我的理解中,final
声明一个常量:不能修改的东西。所以,如果一个集合被声明为一个常量,那么它就不能被修改:不能从集合中删除任何东西,也不能添加任何东西。
为什么我们需要Collections.unmodifiableSet
?
java - Java不可修改数组
我尝试了上面的代码来查看是否可以重新分配最终数组的变量[ ans :it can be]。我理解最终的 Integer[] 数组意味着我们不能分配 Integer[] 的另一个实例,除了我们拥有的那个最初分配。我想知道是否可以使数组变量也不可修改。
java - 什么时候(真的)需要不可修改的地图?
我有一个常量映射,如下所示:
我真的需要用来Collections.unmodifiableMap()
创建这张地图吗?使用它有什么好处?不使用它是否有任何缺点,除了它们并没有真正变得恒定的明显事实之外?
java - 传递 Collections.unmodifiable* 一个已经用 Collections.unmodifiable* 包装的实例的效率有多低?
我有一些由不同的自定义(源代码不可用)框架完成的部分工作,这些框架交还 Map 实例。不幸的是,这些框架在返回的 Map 实例中并不一致,这些实例已经用 Collections.unmodifiableMap 包装。为了确保我的代码具有更高程度的不变性(以便于多线程使用),我刚刚对这些框架返回的任何内容统一调用 Collections.unmodifiableMap。
我意识到我的这部分设计可能存在性能问题。在某些情况下,我调用 Collections.unmodifiableMap 向它传递一个实例,该实例已经被框架通过同一个调用包装。而且我的重新包装可能会导致整个实例的额外方法调用。
似乎使用“instanceof Collections.UnmodifiableMap”不起作用。如果我当前引用的 Map 实例需要被包装,我找不到任何方法来检测(不包括使用反射,这在这种情况下不是一个选项 - 太慢了)。
问题:
- A) Collections.unmodifiableMap() 方法是否检查它是否传递了 UnmodifiableMap 的实例,如果是,则返回相同的引用(从而避免在调用该方法之前需要检查)?
- B)为了主动避免接收到修改异常,有没有办法查询一个Map实例(除了使用反射)来检测它是否可变(或不可变)?
- C) 如果 A 的答案是否定的,那么 JVM/HotSpot 中是否有一些效率可以消除通过多个方法跃点调用以到达核心实例的开销?
java - Java 集合 API:为什么 Unmodifiable[List|Set|Map] 不是公开可见的类?
Collections.unmodifiableList(...)
返回静态内部类 的新实例UnmodifiableList
。其他不可修改的集合类的构造方式相同。
如果这些课程是公开的,其中一个有两个优点:
- 能够指示更具体的返回值(例如
UnmodifiableList
),因此 API 用户不会想到修改该集合; - 能够在运行时检查 a
List
是否为instanceof UnmodifiableList
.
那么,不公开这些课程有什么好处吗?
编辑:没有提出绝对令人信服的论据,所以我选择了最受好评的答案。
java - Guava 的不可变集合的缺陷?
我不确定我理解的不可变集合的缺陷是否正确,所以我在这个答案中列出了它们。希望有人在这里纠正我。
a):与 Collections.unmodifiableXXX() 相比,ImmutableXXX.copyOf()失去了源集合特性。例如,当将linkedList 放入ImmutableList.copyOf() 时,ImmutableList 不再链接。与基于树的集合相同。
b):人们认为 Collections.unmodifiableXXX 只是使用了源集合的相同引用,所以一旦源集合改变,Collections.unmodifiableXXX 也会改变。但我的解决方案是将源集合包装到传递给 ImmutableXXX.copyOf() 的临时集合中。请参见下面的代码:
你对不可变集合的理解是什么?谢谢!
java - Collections.unmodifiableList 是否存在性能风险?
我建议返回 Collections.unmodifiableList() 而不是直接返回成员变量,我的同事担心会影响性能。当然,最好的答案是衡量它,我们可能会这样做 - 但我想知道你的经验和任何参考,赞成或反对。