问题标签 [immutability]
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.
c# - 使哈希表不可变
如何从 Hashtable 创建派生类,其对象可以添加,但不能删除或替换?
我必须覆盖什么,特别是如何覆盖 [] 运算符?
java - 使用Hibernate时@Immutable和@Entity(mutable=false)有什么区别
如果有的话,两者有什么区别?
应该在一个实体上使用一个或两个?
java - 如何限制对可变或不可变方法的访问?
在一个新的 Java 项目中,我尝试应用尽可能多的最佳实践。我遇到的问题是不变性。虽然我理解了这个概念并且已经构建了一些不可变类,但我现在来到了一个我认为将它作为可变类来做更合适的类。
主要问题是我想在某些情况下隐藏类的可变部分,以便在我的情况下 MVC 的视图层不能直接修改对象,但必须通过其控制器。
我想到了两种方法:
创建一个包含所有不可变方法的接口“Thing”(只读)并创建一个包含设置器的接口“MutableThing”。
将所有方法放在一个接口中,并通过像 Collections.unmodifiableList(obj) 方法一样包装对象来限制对变异方法的访问,以便在访问变异方法时抛出异常。
我更喜欢第一个,因为我认为它更干净,设计得更好,但我有一个问题。我在“事物”接口中有 addListener(l) 和 removeListener(l),因此视图层可以将自己注册为某些模型对象的侦听器。但是在“Thing”接口中使用这两种方法,它本身就没有意义了。如果没有实际更改数据的方法,为什么接口能够注册通知数据更改的侦听器?我可以将这些方法放在“MutableThing”接口中,但视图层只能访问“Thing”接口,不能将自己注册为监听器。
这不起作用的原因仅仅是因为侦听器,视图层实际上是否负责将自己注册为模型上的侦听器?如果控制器可以以某种方式做到这一点(它可以访问“MutableThing”),那么就不会有问题,但我不知道如何实现它。
你有什么建议?
谢谢!
c# - 在 C# 中,方法可以返回 List 以便客户端只能读取它,但不能写入它吗?
假设我有一个 C# 类:
客户可以这样称呼它:
有没有办法使Add
方法失败,因为只返回只读版本_barList
?
data-structures - 将 Haskell Edison API 和 Core 移植到 F# 有什么好处吗?
Edison API 和核心模块是纯功能数据结构的 Haskell 实现
F# 和原生 .Net 数据结构是否充分涵盖了 Edison API 和 Core 中的用例?
尝试将 API 和 CORE Haskell 模块移植到 F# 会有什么好处吗?
data-structures - 是否存在具有多个索引的高效索引持久数据结构
我正在寻找一种高效的索引持久数据结构。我通常在 .NET 中工作并且知道 FSharp 的 Map 但是该实现和我知道的大多数其他实现只提供一个“索引”,即映射的左侧。
基本上这是场景
对象的 ID 将是添加的全局唯一项集。GroupId 可能有重复的值,我希望能够查询具有匹配 GroupId 的所有值,并且在 GroupId 内名称将是唯一的,但可能在不同的 GroupId 之间重复。这不是我可以简单地创建 3 个字段的复合键的情况,因为我需要根据特定字段值独立访问项目组。
我可以做到这一点,并且在过去使用字典中的字典,这已在 STackoverflow 上的其他帖子中推荐过......但是,我也希望数据结构是 1)完全持久性和一切意味着 2)高效在内存中 - 意味着版本需要共享尽可能多的节点 3) 高效的修改 - 我希望它快
我意识到我在这里要求很多,但我想要求避免即使已经完成了重新发明轮子。
谢谢
java - 所有最终类都是不可变的吗?
Java中的所有最终类都是不可变的。String 和 Integer 都是最终类,我相信它们都是不可变的。
java - 字符串是不可变的——这意味着我不应该使用 += 并且只使用 StringBuffer?
字符串是不可变的,这意味着一旦创建它们就无法更改。
那么,这是否意味着如果使用 += 附加内容会比创建 StringBuffer 并将文本附加到其中需要更多的内存?
如果你使用 +=,你会在每次必须保存在内存中时创建一个新的“对象”,不是吗?
c# - BigInteger 是不可变的吗?
在 .NET 4 beta 2 中,新的 Numerics 命名空间带有 struct BigInteger
. 正如我所料,文档指出它是一种不可变类型。
但是我对后增量运算符 ( ++
) 有点困惑。这肯定会改变价值。以下 while 循环有效:
这就是 MSDN 关于增量运算符的说法:
因为 BigInteger 对象是不可变的,所以 Increment 运算符创建一个新的 BigInteger 对象,其值比由 value 表示的 BigInteger 对象大一。因此,重复调用 Increment 可能会很昂贵。
一切都很好,如果我不得不使用,我会理解的, b = b++
但显然++
它本身就足以改变一个值。
有什么想法吗?
java - Java 中的函数式数据结构
Java 标准库是否有任何具有功能更新的功能数据结构,例如不可变 Sets、Lists 等?