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

.net - .net (c#) 中的不可变数组:合理的方法?

您可能知道以下问题:您想在两个对象 A 和 B 之间共享一个集合(或者类似地希望通过一个属性公开一个集合)并且......好吧,您意识到这实际上不是一个好主意,因为 A然后B现在可以修改集合和废话世界末日...

但是您经常意识到您不想共享整个集合,而只想用集合中的项目初始化一个对象或将项目传递给对象的方法。此外,对象的项目在对象的生命周期内不会更改,因此您通常最终会执行以下操作:

.ToList() 和 ReadonlyCollection-Wrapper 都为问题提供了合理的解决方案,但也遇到了一些问题: .ToList() 复制了整个 List - 所以我最终得到了同一个集合的 x 个实例,而 ReadOnlyCollection 只确保客户不会更改集合,但不向客户保证集合不会更改。

实际上这是我经常遇到的情况,因为我编写的大多数类(猜测:80 - 90%)实际上是不可变的,并且通常聚合基本上代表不可变数组的集合(在这种情况下意味着:固定大小的不可变序列项)。从我的角度来看,这个问题的一个很好的解决方案非常简单:为一个数组构建一个包装类,保证在构造函数中正确初始化,并且只提供不改变底层数组的方法/属性。

长话短说:以下(微不足道的)不可变数组概念的实现有什么问题吗?

顺便说一句:我认为 Sequence 是一个合适的名称,因为 a)它很好地描述了意图(一个固定大小的不可变项目序列)b)它不是 .net 当前使用的名称,并且 c)它很短,即很重要,因为我打算广泛使用它。

0 投票
2 回答
700 浏览

c# - Xaml 序列化和不可变结构?

我怎样才能做到这一点?

尝试使用 TypeConverter,但我唯一能想到的就是为类型构造 XML,这并没有完全削减它。xaml 序列化中的 TypeConverters 将转义 xml 并将其视为纯文本。价值转换器也好不到哪里去。

现在,我正在转向 ISupportInitialize,如果在初始化后进行更改,我会抛出,但我会喜欢不可变的路线......


我希望序列化的类型示例:

和代码

0 投票
5 回答
11892 浏览

string - 在每次迭代中分配“它”(groovy)

嘿,我尝试在 groovy 中修剪列表的每个字符串项

但这仅适用于闭包,列表中的字符串仍然是“foo”、“bar”和“groovy”。

我怎样才能做到这一点?

0 投票
9 回答
517 浏览

java - 关于不变性影响的经验数据?

今天在课堂上,我的教授正在讨论如何组织一堂课。该课程主要使用Java,我比老师有更多的Java经验(他来自C++背景),所以我提到在Java中应该支持不变性。我的教授让我证明我的回答是正确的,我给出了我从 Java 社区听到的理由:

  1. 安全性(尤其是螺纹)
  2. 减少对象数量
  3. 允许某些优化(尤其是垃圾收集器)

教授对我的说法提出了质疑,他说他希望看到对这些好处的一些统计测量。我引用了大量轶事证据,但即使我这样做了,我也意识到他是对的:据我所知,对于不变性是否真的提供了它在现实世界代码中所承诺的好处,还没有实证研究。我知道这是从经验中得出的,但其他人的经验可能会有所不同。

所以,我的问题是,是否有任何关于真实世界代码中不变性影响的统计研究?

0 投票
2 回答
2555 浏览

immutability - 与静态方法相比,不可变对象有哪些优势?

我也可以将其实现为:

我什么时候应该选择不可变对象而不是静态方法?在任何情况下,情况可能相反吗?

另外,在我看来,不可变对象不应该有 void 方法。你怎么看?

0 投票
3 回答
2911 浏览

java - 使用 LCDS 将不可变的 java 类序列化为 actionscript

我有一个复杂的对象,它由 LCDS DataServices 数据管理进行管理,并使用自定义汇编程序创建/更新等。绝大多数对象层次结构都被正确地序列化/反序列化,但是在序列化不可变的 java 类时我遇到了一个绊脚石。

在只有 java 的世界中,我会使用 java writeReplace 和 readResolve 方法,正如这个优秀的博客所描述的那样:http: //lingpipe-blog.com/2009/08/10/serializing-immutable-singletons-serialization-proxy/

这就是我最初编写 java 类的方式,期望 livecycle 调用 writeReplace 方法并将不可变类适当地替换为可变类以进行序列化。然而,lcds 似乎对 writeReplace 方法一无所知,只会调用 readExternal/writeExternal 忽略 readResolve 和 writeReplace。

首先,其他人是否发现是这种情况,或者我错过了什么?

其次,有没有人想出一种适当的方法来将 actionscript 类反序列化为不可变对象或单例?

非常感谢

0 投票
2 回答
1672 浏览

nhibernate - 为什么 NHibernate 会删除不可变的类实例?

我正在尝试将应用程序从 NHibernate 1.x 迁移到 2.1,我注意到一些奇怪的事情:我的不可变对象在我的集成测试中被删除了。

例如,这个测试曾经通过:

应该抛出对 CommitChanges 的调用,因为试图删除其类型映射为 mutable="false" 的实例。然而,在更新了预期的异常类型之后,这个测试现在失败了(因为没有抛出异常)。我检查了数据库并通过测试进行了跟踪,创建了记录,加载了实例,然后再次删除了记录。

有问题的类与另一个类映射到同一个表 - 它或多或少旨在作为该数据子集的只读视图。这是类映射:

我希望我遗漏了一些基本的东西,但是我一直在网上搜索 mutable 属性可能被忽略的任何原因,但我发现是空的。

更新:

使用 Log4Net 进行日志记录,很明显 NHibernate 正在向数据库发送删除命令。

0 投票
6 回答
16973 浏览

python - 为什么 python 字符串和元组是不可变的?

我不确定为什么字符串和元组是不可变的。使它们不可变的优点和缺点是什么?

0 投票
26 回答
100469 浏览

java - Java中字符串的不变性

考虑以下示例。

现在,在 Java 中,String 对象是不可变的。那么为什么可以为对象str分配值“Help!”。这不是与 Java 中字符串的不变性相矛盾吗?谁能解释一下不变性的确切概念?

编辑:

行。我现在明白了,但只是一个后续问题。下面的代码呢:

这是否意味着再次创建了两个对象(“Mississippi”和“M!ss!ss!pp!”),并且引用在方法str之后指向不同的对象replace()

0 投票
6 回答
1257 浏览

c# - 为什么字体不可变?

字体不可变让程序员和 GC 都感到苦恼,因为您每次都需要创建一个新实例。

那么为什么 Font 是不可变的引用类型呢?