问题标签 [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 投票
1 回答
584 浏览

java - Collections.unmodifiableCollection 和 Collections.unmodifiableSet

假设我有以下Set

如果我想创建一个防御性副本,这样如果原始列表被修改,副本不会反映它,我可以这样做:

所以如果我这样做:

unmodifiableFruits不会有菠萝。

或者我可以这样:

结果是一样的,unmodifiableFruits不会有菠萝。

问题:

  1. 假设如果我fruits作为参数传递给一个类,首选方法是Collections.unmodifiableCollection()

原因是,我读过在构造函数中声明new是一种不好的做法,如果我要使用Collections.unmodifiableSet(),我需要声明一个new HashSet<String>(fruits).

  1. 为什么我不能这样做?

    Collections.unmodifiableSet(fruits)

并让它返回一个不可修改的集合。

相反,我必须这样做:

是不是因为 Set 是一个接口,它不知道要返回哪个实现?

0 投票
1 回答
1704 浏览

groovy - 为什么 Collections.unmodifiableCollection 允许您更改集合?

假设我必须遵循set

如果我在Collections.unmodifiableSet()尝试使用该方法时使用它会引发异常add(),但对于Collections.unmodifiableCollection(). 为什么?

根据文档,它应该抛出一个错误:

返回指定集合的​​不可修改视图。此方法允许模块为用户提供对内部集合的“只读”访问权限。对返回集合的查询操作“通读”到指定集合,并尝试修改返回的集合,无论是直接还是通过其迭代器,都会导致 UnsupportedOperationException。

所有代码均使用 Groovy 2.5.2 编写

0 投票
1 回答
485 浏览

java - 将不可修改列表中的元素添加到地图

我不确定我是否想在这里做一些愚蠢的事情,但我找不到任何关于这件事的合适信息。我从远程位置通过 Collections.unmodifiableList(MyList) 获取列表。然后我想将接收到的元素添加到一个映射中以进行缓冲。奇怪的是 Eclipse 不允许我将所需的对象添加到地图中,并声明未为我创建的地图定义 add 方法。更准确地说,这是我的问题的代表性代码:

在我尝试将对象添加到缓冲区的行中,添加函数带有下划线,它告诉我:

这与我的临时列表不可修改有关吗?无论如何,我只想从地图中的元素中读取信息。

提前致谢!

0 投票
1 回答
893 浏览

java - 如何将 UnmodifiableRandomAccessList 设置为 Set in java

There is an Oauth2Authentication object that contains user-authority. When I want to get its authority and set it in authority of User object like this:

OAuth2Authe

There is an Oauth2Authentication object that contains user-authority. When I want to get its authority and set it in authority of User object like this:

the following exception is raised:

java.lang.ClassCastException: java.util.Collections$UnmodifiableRandomAccessList cannot be cast to java.util.Set

How do I fix it?

Note:
The type of Authorities of User object is Set<GrantedAuthority>


If oAuth2Authentication.getAuthorities() is a List, you can easily create a Set from it:

Note that GrantedAuthority should have a proper implementation of hashCode() and equals() in order to be used as a member of a HashSet.

0 投票
1 回答
149 浏览

javascript - 通过重新分配使对象属性不可更改,但在 JavaScript 中可修改

我有这个类,它定义了玩家角色将如何。我想通过重新分配使两者experienceObtainedgold属性都不可更改,但可以通过运算符进行修改,以避免用户使用控制台将自己的值设置为这些属性。

如上所示,我尝试使用 getter 而不声明 setter,但我仍然可以amount通过控制台分配任何值。

我不知道我是否误解了 JavaScript 中 getter 和 setter 的使用,或者是否无法做到。

0 投票
1 回答
1352 浏览

java - 方法 unmodifiablelist() 不能应用于给定类型

我正在尝试编译前同事的代码,但它说该方法unmodifiableList()不能应用于给定类型。Eclipse 中的代码没有显示任何错误。但它仍然不允许我编译它。可能是什么错误?

这是我编译应用程序后 eclipse 打印的错误日志/信息:

0 投票
1 回答
748 浏览

java - 启用默认类型后,有没有办法覆盖杰克逊输出的类型?

我正在序列化一个类,该类包含一个启用了默认类型的不可修改列表。问题是杰克逊使用的类型是

由于某种原因,反序列化器不知道如何处理。

有没有办法告诉杰克逊将类型设置为

反序列化器确实知道如何处理?如果可能的话,我想用 mixins 来做。

就像是

不幸的是,这不起作用。

0 投票
2 回答
204 浏览

java - 如何使 Map 的专业化不可修改?

我目前正在用一个中型编码示例更新我的 Java 知识。我有一个数据结构Map<String, String>,通常用它来初始化它new LinkedHashMap<>()以保留插入顺序。我在我的代码中经常使用它,我想摆脱声明重复。在 C++ 中,我会为地图设置别名,但据我所知,在 Java 中没有别名。

所以我想出了像这样子类化泛型的想法:

到目前为止这看起来不错,但现在我想创建一个不可修改的副本,因为属性应该是不可变/不可修改数据结构的一部分。在我使用这个之前:

这不适用于派生类,我试过这个:

编译器用 拒绝它Incompatible types

有没有一种简单的方法可以获取此类子类的不可修改(或不可变)副本?还是我的想法完全错误?我不想写一个功能齐全的装饰器,就几行代码。

更新

到目前为止,我想做的事情似乎没有好的解决方案。我查看了 Java Collections 类的源代码,其中有用于不可修改的映射和类似集合的内部类。这些用于包装输入集合并由相应的静态方法返回。可以重新实现这一点,但我认为开销太大。

我们更多地讨论了 LSP 违规而不是原来的问题,这确实也是一个有趣的问题。

0 投票
2 回答
183 浏览

java - 可以使 Java 流收集器返回的列表不可修改吗?

在处理 Java 流时,我们可以使用收集器来生成一个集合,例如流。

例如,这里我们创建一个Month枚举对象流,并为每个对象生成一个String包含月份的本地化名称。我们通过调用 将结果收集到一个List类型中。StringCollectors.toList()

monthNames.toString(): [janvier, février, mars, avril, mai, juin, juillet, août, septembre, octobre, novembre, décembre]

为了使该列表不可修改,我们可以List.copyOf在 Java 10 及更高版本中调用。

➥ 有没有办法让带有收集器的流产生一个不可修改的列表,而我不需要包装调用List.copyOf

0 投票
4 回答
195 浏览

java - Java - 将 map(key, set) 中的不可修改集转换为可修改集

我实现了一个返回函数Map<key,Set<objects>>,当我调用这个函数时,它返回类型为不可修改的集合。

我需要对这个集合做一些操作,如何在最佳实践中将它们转换为可修改的集合?否则我得到

提前致谢。