问题标签 [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.

0 投票
6 回答
12283 浏览

java - 如何在 Java 中返回线程安全/不可变集合?

在我正在编码的项目中,我需要从函数返回一个线程安全且不可变的视图。但是,我不确定这一点。因为synchronizedList并且unmodifiableList只是返回列表的视图,我不知道是否

Collections.synchronizedList(Collections.unmodifiableList(this.data));

会成功的。

谁能告诉我这是否正确,如果不是,是否有任何情况可能会失败?

感谢您的任何投入!

0 投票
3 回答
25269 浏览

java - 返回不可修改的地图

使用Collections.unmodifiableMap(...),我试图返回地图的不可修改视图。假设我有以下方法,

为什么在其他地方执行以下操作是合法的,

这不会UnsupportedOperationException像我想象的那样抛出。有人可以解释一下,或者建议我如何成功返回真正不可修改的地图吗?

0 投票
2 回答
2204 浏览

java - 制作不可修改的对象

我有一个 Java 应用程序,其中域层通过控制器与 UI 分离。问题是这些控制器可以返回域对象,并且可以将域对象作为参数。

其中一些返回的域对象是可变的,这就是我想要阻止的。我希望 UI(或未来的 UI)在不访问控制器的情况下直接修改域是不可能的。

我尝试了两种选择:

  • 在第一个中,我确保每个类都实现了一个只包含 getter的“不可修改”接口。如果我需要将一个对象返回给 UI,我会返回它的“不可修改”界面。这样 UI 只能查看 getter。这样做的问题是它们仍然可以轻松地转换为原始对象并获得访问权限。起初我以为这种级别的安全性已经足够了,但碰巧有人不小心铸造了一些物体并以不正确的方式使用它们,从而破坏了完整性。

  • 在第二个中,我尝试为每个可以返回的对象提供不可修改的包装器。但问题是这些返回的对象可以用作控制器中方法的参数,因此它们需要在控制器中展开。我试图使uwrap()方法包私有,但是我必须将每个特定的包装类与控制器放在同一个包中,这有点不方便。

编辑:第三个选项:

  • (感谢vic)在第三个选项中,对象被一个不可修改的wrapper 包裹,但不能被这个 wrapper 解包。每个 Unmodifiable 都链接到其在 Hashmap 中的可修改对象。因此,“展开”是通过获取链接到不可修改对象的可修改对象来完成的。

有没有人知道或有一些想法如何使对象不可修改,以便控制器可以返回它们,并在将它们传递回控制器时使它们再次可修改成为可能?

0 投票
1 回答
1953 浏览

java - Collections.unmodifiableCollection() 的 hashCode 和 equals

该类Collections有许多静态辅助方法来提供各种集合类型的只读视图,例如unmodifiableSet(),unmodifiableList()等。对于这些视图对象,hashCode()andequals()方法将调用转发到底层集合......有一个奇怪的例外:unmodifiableCollection().

JavaDoc明确指出

返回的集合不会hashCode 和 equals 操作传递给支持集合,而是依赖于Object'sequalshashCode方法。在支持集合是集合或列表的情况下,这对于保留这些操作的合同是必要的。

我的问题:这是在说什么?如果支持集合是集合或列表,我希望行为与unmodifiableSet()and一致unmodifiableList()。这将如何违反 hashCode/equals 合约?

0 投票
2 回答
75 浏览

java - 有人打破了我对列表的排序 - 现在选择哪种方法:返回不可修改的列表还是一个新的列表?

我正在使用 jsf Web 服务器上的列表来例如从网页访问数据模型。对这些列表的访问也可以从其他各种地方(Web 服务、工具)完成。

有一段代码被我返回的列表破坏了。我说的是我的开发团队中的某个人——我们是唯一使用此代码的人。我对这个函数有大约 300 个引用,它可能与性能相关,可以很好地进行修复:

该列表可以是 1 到 10'000 个条目之间的任何地方,通常我可能会有 10-100 个这样的列表。实际上,我可能经常有大约 20 个列表,每个列表有 8 个条目 - 所以没什么大不了的。但有时我可以拥有更多

我顺便说一下这样的功能:

现在我当然可以像这样返回:

但这最终会在不同项目/应用程序的几个地方中断。恕我直言,返回不可修改、添加 javadoc 并修复所有损坏的东西是最干净的。但是 :-D 这是工作。我可能需要测试大约 10 个应用程序。

另一方面,我可以只返回一个新列表,例如

这不是什么小工作——但是这方面的性能问题呢?除此之外 - 如果有人从我返回的列表中删除东西,它会默默地破坏应用程序。

那么:性能问题是什么?这是一个问题吗?

你会怎么做?

0 投票
3 回答
3291 浏览

java - unmodifiableList 线程安全吗?

我有一个字符串(tagList)列表,需要在多个线程之间共享以进行读取,所以我创建了一个不可修改的版本并将其传递给线程,我不确定它是否是线程安全的,因为线程只读取该列表所以我猜应该没问题吧?

另外,当我将该不可修改的列表传递给线程时,它是传递一个副本并由线程共享还是创建多个副本并将一个副本传递给每个线程?

这是我的代码:

0 投票
9 回答
33412 浏览

java - Collections.unmodifiableList 和防御性副本

如果我写

a2是只读的,但如果我写

然后a2也被修改。

如果在 API 中说:

返回指定集合的​​不可修改视图。此方法允许模块为用户提供对内部集合的“只读”访问权限。

那么,为什么如果我修改原始集合也修改了目标复制的集合?

也许我误解了它的含义,如果是这样,那么编写该集合的防御性副本的方法是什么?

0 投票
2 回答
850 浏览

java - 不可修改的 Map 仍然接受添加条目而不返回 UnsupportedOperationException

我正在尝试向不可修改的 Map 添加条目,JVM 在将条目添加到原始 Map 的子视图时捕获 UnsupportedOperationException,但 JVM 不关心直接添加到原始视图,代码说明:

但是 Collections.unmodifiableSortedMap() 的文档说:

尝试修改返回的排序地图,无论是直接的、通过它的集合视图,还是通过它的 subMap、headMap 或 tailMap 视图,都会导致 UnsupportedOperationException。

请伸出援手,谢谢。

0 投票
7 回答
64585 浏览

java - java中不可修改的列表

我正在尝试设置一个List不可修改的。

在我的代码中,我有一个返回列表的方法。

这个列表不应该被修改,但我不想捕获 unmodifiableList 返回的异常。

这是一个现有代码,我必须对其进行转换以返回一个不可修改的列表,但如果调用了“add”方法,则不必捕获任何异常。

首先,我创建了一个实现 List 以覆盖“add”方法来记录异常而不是捕获它的类。

但我不知道如何正确实例化它......

0 投票
1 回答
1143 浏览

java - Collections.unmodifiableList 包装已经不可修改的列表?

在 Collections.unmodifiableList 实现中,我看到它总是用 UnmodifiableList 包装给定列表,即使给定列表已经是 UnmodifiableList ......所以如果我一遍又一遍地调用这个方法 - 我会得到一个巨大的堆栈跟踪,如下所示:

我想检查列表是否已经是 UnmodifiabelList 并返回相同的列表,就像谷歌的收藏一样,但这不是公共课程。

任何建议如何优雅地解决这个问题?

谢谢