问题标签 [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 - Collections.unmodifiableCollection 和 Collections.unmodifiableSet
假设我有以下Set
如果我想创建一个防御性副本,这样如果原始列表被修改,副本不会反映它,我可以这样做:
所以如果我这样做:
unmodifiableFruits
不会有菠萝。
或者我可以这样:
结果是一样的,unmodifiableFruits
不会有菠萝。
问题:
- 假设如果我
fruits
作为参数传递给一个类,首选方法是Collections.unmodifiableCollection()
?
原因是,我读过在构造函数中声明new
是一种不好的做法,如果我要使用Collections.unmodifiableSet()
,我需要声明一个new HashSet<String>(fruits)
.
为什么我不能这样做?
Collections.unmodifiableSet(fruits)
并让它返回一个不可修改的集合。
相反,我必须这样做:
是不是因为 Set 是一个接口,它不知道要返回哪个实现?
groovy - 为什么 Collections.unmodifiableCollection 允许您更改集合?
假设我必须遵循set
:
如果我在Collections.unmodifiableSet()
尝试使用该方法时使用它会引发异常add()
,但对于Collections.unmodifiableCollection()
. 为什么?
根据文档,它应该抛出一个错误:
返回指定集合的不可修改视图。此方法允许模块为用户提供对内部集合的“只读”访问权限。对返回集合的查询操作“通读”到指定集合,并尝试修改返回的集合,无论是直接还是通过其迭代器,都会导致 UnsupportedOperationException。
所有代码均使用 Groovy 2.5.2 编写
java - 将不可修改列表中的元素添加到地图
我不确定我是否想在这里做一些愚蠢的事情,但我找不到任何关于这件事的合适信息。我从远程位置通过 Collections.unmodifiableList(MyList) 获取列表。然后我想将接收到的元素添加到一个映射中以进行缓冲。奇怪的是 Eclipse 不允许我将所需的对象添加到地图中,并声明未为我创建的地图定义 add 方法。更准确地说,这是我的问题的代表性代码:
在我尝试将对象添加到缓冲区的行中,添加函数带有下划线,它告诉我:
这与我的临时列表不可修改有关吗?无论如何,我只想从地图中的元素中读取信息。
提前致谢!
javascript - 通过重新分配使对象属性不可更改,但在 JavaScript 中可修改
我有这个类,它定义了玩家角色将如何。我想通过重新分配使两者experienceObtained
和gold
属性都不可更改,但可以通过运算符进行修改,以避免用户使用控制台将自己的值设置为这些属性。
如上所示,我尝试使用 getter 而不声明 setter,但我仍然可以amount
通过控制台分配任何值。
我不知道我是否误解了 JavaScript 中 getter 和 setter 的使用,或者是否无法做到。
java - 方法 unmodifiablelist() 不能应用于给定类型
我正在尝试编译前同事的代码,但它说该方法unmodifiableList()
不能应用于给定类型。Eclipse 中的代码没有显示任何错误。但它仍然不允许我编译它。可能是什么错误?
这是我编译应用程序后 eclipse 打印的错误日志/信息:
java - 启用默认类型后,有没有办法覆盖杰克逊输出的类型?
我正在序列化一个类,该类包含一个启用了默认类型的不可修改列表。问题是杰克逊使用的类型是
由于某种原因,反序列化器不知道如何处理。
有没有办法告诉杰克逊将类型设置为
反序列化器确实知道如何处理?如果可能的话,我想用 mixins 来做。
就像是
不幸的是,这不起作用。
java - 如何使 Map 的专业化不可修改?
我目前正在用一个中型编码示例更新我的 Java 知识。我有一个数据结构Map<String, String>
,通常用它来初始化它new LinkedHashMap<>()
以保留插入顺序。我在我的代码中经常使用它,我想摆脱声明重复。在 C++ 中,我会为地图设置别名,但据我所知,在 Java 中没有别名。
所以我想出了像这样子类化泛型的想法:
到目前为止这看起来不错,但现在我想创建一个不可修改的副本,因为属性应该是不可变/不可修改数据结构的一部分。在我使用这个之前:
这不适用于派生类,我试过这个:
编译器用 拒绝它Incompatible types
。
有没有一种简单的方法可以获取此类子类的不可修改(或不可变)副本?还是我的想法完全错误?我不想写一个功能齐全的装饰器,就几行代码。
更新
到目前为止,我想做的事情似乎没有好的解决方案。我查看了 Java Collections 类的源代码,其中有用于不可修改的映射和类似集合的内部类。这些用于包装输入集合并由相应的静态方法返回。可以重新实现这一点,但我认为开销太大。
我们更多地讨论了 LSP 违规而不是原来的问题,这确实也是一个有趣的问题。
java - 可以使 Java 流收集器返回的列表不可修改吗?
在处理 Java 流时,我们可以使用收集器来生成一个集合,例如流。
例如,这里我们创建一个Month
枚举对象流,并为每个对象生成一个String
包含月份的本地化名称。我们通过调用 将结果收集到一个List
类型中。String
Collectors.toList()
monthNames.toString(): [janvier, février, mars, avril, mai, juin, juillet, août, septembre, octobre, novembre, décembre]
为了使该列表不可修改,我们可以List.copyOf
在 Java 10 及更高版本中调用。
➥ 有没有办法让带有收集器的流产生一个不可修改的列表,而我不需要包装调用List.copyOf
?
java - Java - 将 map(key, set) 中的不可修改集转换为可修改集
我实现了一个返回函数Map<key,Set<objects>>
,当我调用这个函数时,它返回类型为不可修改的集合。
我需要对这个集合做一些操作,如何在最佳实践中将它们转换为可修改的集合?否则我得到
提前致谢。