- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我经常对我的 java 代码使用这种策略,以便让一个集合只对外界可读,但要避免大量/经常克隆:
public abstract class MyClass {
List<Long> myIds;
public Collection<Long> getIds() {
return Collections.unmodifiableCollection(this.myIds);
}
}
我想在我的 JS 类中遵循相同的模式。这将使我的业务逻辑代码更加安全和清晰,因为我将能够在拥有字段的类中控制对我的列表(推送/拼接等)的所有更改。
目前使用列表的“私有(private)”字段和从外部访问它们的 get-set 函数。唯一缺少的链接是一些等效于 java 的 Collections.unmodifiableCollection 的链接。不会复制整个列表的东西(例如 slice()),并且不会影响原始字段(例如 Object.freeze())。
JS有这样的功能吗?如果没有,有人怎么能达到类似的效果(自定义可迭代对象?)
最佳答案
如果您不想复制对象,并且想确保原始对象不能在外部发生变异,一种选择是返回一个 Proxy,它会在任何尝试发生变异时抛出:
const handler = {
get(obj, prop) {
return obj[prop];
},
set() {
throw new Error('Setting not permitted');
}
}
class MyClass {
_myIds = ['foo', 'bar']
getIds() {
return new Proxy(this._myIds, handler);
}
}
const instance = new MyClass();
const ids = instance.getIds();
console.log(ids);
// Error:
// ids[2] = 'baz';
// Error:
// ids.push('baz');
当然,instance._myIds
在技术上仍然可见 - 如果您想防止这种情况,您可以使用类似 WeakMap 的东西以确保私有(private)数组真正只在类内部可见。
但是代理有点慢。您可能会考虑像 Typescript 的 ReadonlyArray
这样的东西 - 这样,您可以确保代码不包含任何在 返回 后改变数组的内容,同时保持实际代码的速度在运行时:
private myIds = ['foo', 'bar']
public getIds() {
return this.myIds as ReadonlyArray<string>;
}
关于javascript - JS相当于Java的Collections.unmodifiableCollection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56322702/
我经常对我的 java 代码使用这种策略,以便让一个集合只对外界可读,但要避免大量/经常克隆: public abstract class MyClass { List myIds;
在服务器为客户端提供现有集合的不可修改的集合,并且客户端开始对其进行迭代的场景中,同时如果在服务器级别,一个线程更改列表,例如删除其中的一个元素。这会导致客户端异常吗?如果是,那会是什么?客户端在迭代
假设我必须关注 set : Set fruits = new HashSet() fruits.add("Apple") fruits.add("Grapes") fruits.add("Orange
静态初始化的unmodifiableCollection.get是否保证不可变? 对于: 静态最终 map FOO = Collections.unmodifiableMap(new HashMap(
private List list; 如果我们使用 Collections.unmodifiableCollection(list),这会返回集合的副本,还是比创建副本更快?我们可以做 other.a
The unmodifiableCollection method (as well as thesynchronizedCollection and checkedCollectionmethods
如果我们考虑任何泛型类型,例如,下面给出的代码取自java.util.Collections, static class UnmodifiableCollection implements Colle
Collections类有很多静态辅助方法来提供各种集合类型的只读 View ,比如unmodifiableSet(), unmodifiableList() 等。对于这些 View 对象,hashC
这是我们的rest模板配置 @Bean public RestTemplate infoBloxRestTemplate() { RestTemplate restTempla
给定集合: Collection expected = Collections.singletonList(new MyObject); Collection actual = Collections
我是一名优秀的程序员,十分优秀!