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

0 投票
2 回答
1004 浏览

c# - 使哈希表不可变

如何从 Hashtable 创建派生类,其对象可以添加,但不能删除或替换?

我必须覆盖什么,特别是如何覆盖 [] 运算符?

0 投票
2 回答
24276 浏览

java - 使用Hibernate时@Immutable和@Entity(mutable=false)有什么区别

如果有的话,两者有什么区别?

应该在一个实体上使用一个或两个?

0 投票
4 回答
1032 浏览

java - 如何限制对可变或不可变方法的访问?

在一个新的 Java 项目中,我尝试应用尽可能多的最佳实践。我遇到的问题是不变性。虽然我理解了这个概念并且已经构建了一些不可变类,但我现在来到了一个我认为将它作为可变类来做更合适的类。

主要问题是我想在某些情况下隐藏类的可变部分,以便在我的情况下 MVC 的视图层不能直接修改对象,但必须通过其控制器。

我想到了两种方法:

  1. 创建一个包含所有不可变方法的接口“Thing”(只读)并创建一个包含设置器的接口“MutableThing”。

  2. 将所有方法放在一个接口中,并通过像 Collections.unmodifiableList(obj) 方法一样包装对象来限制对变异方法的访问,以便在访问变异方法时抛出异常。

我更喜欢第一个,因为我认为它更干净,设计得更好,但我有一个问题。我在“事物”接口中有 addListener(l) 和 removeListener(l),因此视图层可以将自己注册为某些模型对象的侦听器。但是在“Thing”接口中使用这两种方法,它本身就没有意义了。如果没有实际更改数据的方法,为什么接口能够注册通知数据更改的侦听器?我可以将这些方法放在“MutableThing”接口中,但视图层只能访问“Thing”接口,不能将自己注册为监听器。

这不起作用的原因仅仅是因为侦听器,视图层实际上是否负责将自己注册为模型上的侦听器?如果控制器可以以某种方式做到这一点(它可以访问“MutableThing”),那么就不会有问题,但我不知道如何实现它。

你有什么建议?

谢谢!

0 投票
2 回答
3485 浏览

c# - 在 C# 中,方法可以返回 List 以便客户端只能读取它,但不能写入它吗?

假设我有一个 C# 类:

客户可以这样称呼它:

有没有办法使Add方法失败,因为只返回只读版本_barList

0 投票
3 回答
385 浏览

data-structures - 将 Haskell Edison API 和 Core 移植到 F# 有什么好处吗?

Edison API 和核心模块是纯功能数据结构的 Haskell 实现

F# 和原生 .Net 数据结构是否充分涵盖了 Edison API 和 Core 中的用例?

尝试将 API 和 CORE Haskell 模块移植到 F# 会有什么好处吗?

0 投票
3 回答
921 浏览

data-structures - 是否存在具有多个索引的高效索引持久数据结构

我正在寻找一种高效的索引持久数据结构。我通常在 .NET 中工作并且知道 FSharp 的 Map 但是该实现和我知道的大多数其他实现只提供一个“索引”,即映射的左侧。

基本上这是场景

对象的 ID 将是添加的全局唯一项集。GroupId 可能有重复的值,我希望能够查询具有匹配 GroupId 的所有值,并且在 GroupId 内名称将是唯一的,但可能在不同的 GroupId 之间重复。这不是我可以简单地创建 3 个字段的复合键的情况,因为我需要根据特定字段值独立访问项目组。

我可以做到这一点,并且在过去使用字典中的字典,这已在 STackoverflow 上的其他帖子中推荐过......但是,我也希望数据结构是 1)完全持久性和一切意味着 2)高效在内存中 - 意味着版本需要共享尽可能多的节点 3) 高效的修改 - 我希望它快

我意识到我在这里要求很多,但我想要求避免即使已经完成了重新发明轮子。

谢谢

0 投票
8 回答
6975 浏览

java - 所有最终类都是不可变的吗?

Java中的所有最终类都是不可变的。String 和 Integer 都是最终类,我相信它们都是不可变的。

0 投票
11 回答
7403 浏览

java - 字符串是不可变的——这意味着我不应该使用 += 并且只使用 StringBuffer?

字符串是不可变的,这意味着一旦创建它们就无法更改。

那么,这是否意味着如果使用 += 附加内容会比创建 StringBuffer 并将文本附加到其中需要更多的内存?

如果你使用 +=,你会在每次必须保存在内存中时创建一个新的“对象”,不是吗?

0 投票
5 回答
1741 浏览

c# - BigInteger 是不可变的吗?

在 .NET 4 beta 2 中,新的 Numerics 命名空间带有 struct BigInteger. 正如我所料,文档指出它是一种不可变类型。

但是我对后增量运算符 ( ++) 有点困惑。这肯定会改变价值。以下 while 循环有效:

这就是 MSDN 关于增量运算符的说法:

因为 BigInteger 对象是不可变的,所以 Increment 运算符创建一个新的 BigInteger 对象,其值比由 value 表示的 BigInteger 对象大一。因此,重复调用 Increment 可能会很昂贵。

一切都很好,如果我不得不使用,我会理解的, b = b++但显然++它本身就足以改变一个值。

有什么想法吗?

0 投票
10 回答
3139 浏览

java - Java 中的函数式数据结构

Java 标准库是否有任何具有功能更新的功能数据结构,例如不可变 Sets、Lists 等?