问题标签 [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.
.net - .net (c#) 中的不可变数组:合理的方法?
您可能知道以下问题:您想在两个对象 A 和 B 之间共享一个集合(或者类似地希望通过一个属性公开一个集合)并且......好吧,您意识到这实际上不是一个好主意,因为 A然后B现在可以修改集合和废话世界末日...
但是您经常意识到您不想共享整个集合,而只想用集合中的项目初始化一个对象或将项目传递给对象的方法。此外,对象的项目在对象的生命周期内不会更改,因此您通常最终会执行以下操作:
.ToList() 和 ReadonlyCollection-Wrapper 都为问题提供了合理的解决方案,但也遇到了一些问题: .ToList() 复制了整个 List - 所以我最终得到了同一个集合的 x 个实例,而 ReadOnlyCollection 只确保客户不会更改集合,但不向客户保证集合不会更改。
实际上这是我经常遇到的情况,因为我编写的大多数类(猜测:80 - 90%)实际上是不可变的,并且通常聚合基本上代表不可变数组的集合(在这种情况下意味着:固定大小的不可变序列项)。从我的角度来看,这个问题的一个很好的解决方案非常简单:为一个数组构建一个包装类,保证在构造函数中正确初始化,并且只提供不改变底层数组的方法/属性。
长话短说:以下(微不足道的)不可变数组概念的实现有什么问题吗?
顺便说一句:我认为 Sequence 是一个合适的名称,因为 a)它很好地描述了意图(一个固定大小的不可变项目序列)b)它不是 .net 当前使用的名称,并且 c)它很短,即很重要,因为我打算广泛使用它。
c# - Xaml 序列化和不可变结构?
我怎样才能做到这一点?
尝试使用 TypeConverter,但我唯一能想到的就是为类型构造 XML,这并没有完全削减它。xaml 序列化中的 TypeConverters 将转义 xml 并将其视为纯文本。价值转换器也好不到哪里去。
现在,我正在转向 ISupportInitialize,如果在初始化后进行更改,我会抛出,但我会喜欢不可变的路线......
我希望序列化的类型示例:
和代码
string - 在每次迭代中分配“它”(groovy)
嘿,我尝试在 groovy 中修剪列表的每个字符串项
但这仅适用于闭包,列表中的字符串仍然是“foo”、“bar”和“groovy”。
我怎样才能做到这一点?
java - 关于不变性影响的经验数据?
今天在课堂上,我的教授正在讨论如何组织一堂课。该课程主要使用Java,我比老师有更多的Java经验(他来自C++背景),所以我提到在Java中应该支持不变性。我的教授让我证明我的回答是正确的,我给出了我从 Java 社区听到的理由:
- 安全性(尤其是螺纹)
- 减少对象数量
- 允许某些优化(尤其是垃圾收集器)
教授对我的说法提出了质疑,他说他希望看到对这些好处的一些统计测量。我引用了大量轶事证据,但即使我这样做了,我也意识到他是对的:据我所知,对于不变性是否真的提供了它在现实世界代码中所承诺的好处,还没有实证研究。我知道这是从经验中得出的,但其他人的经验可能会有所不同。
所以,我的问题是,是否有任何关于真实世界代码中不变性影响的统计研究?
immutability - 与静态方法相比,不可变对象有哪些优势?
我也可以将其实现为:
我什么时候应该选择不可变对象而不是静态方法?在任何情况下,情况可能相反吗?
另外,在我看来,不可变对象不应该有 void 方法。你怎么看?
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 类反序列化为不可变对象或单例?
非常感谢
nhibernate - 为什么 NHibernate 会删除不可变的类实例?
我正在尝试将应用程序从 NHibernate 1.x 迁移到 2.1,我注意到一些奇怪的事情:我的不可变对象在我的集成测试中被删除了。
例如,这个测试曾经通过:
应该抛出对 CommitChanges 的调用,因为试图删除其类型映射为 mutable="false" 的实例。然而,在更新了预期的异常类型之后,这个测试现在失败了(因为没有抛出异常)。我检查了数据库并通过测试进行了跟踪,创建了记录,加载了实例,然后再次删除了记录。
有问题的类与另一个类映射到同一个表 - 它或多或少旨在作为该数据子集的只读视图。这是类映射:
我希望我遗漏了一些基本的东西,但是我一直在网上搜索 mutable 属性可能被忽略的任何原因,但我发现是空的。
更新:
使用 Log4Net 进行日志记录,很明显 NHibernate 正在向数据库发送删除命令。
python - 为什么 python 字符串和元组是不可变的?
我不确定为什么字符串和元组是不可变的。使它们不可变的优点和缺点是什么?
java - Java中字符串的不变性
考虑以下示例。
现在,在 Java 中,String 对象是不可变的。那么为什么可以为对象str
分配值“Help!”。这不是与 Java 中字符串的不变性相矛盾吗?谁能解释一下不变性的确切概念?
编辑:
行。我现在明白了,但只是一个后续问题。下面的代码呢:
这是否意味着再次创建了两个对象(“Mississippi”和“M!ss!ss!pp!”),并且引用在方法str
之后指向不同的对象replace()
?
c# - 为什么字体不可变?
字体不可变让程序员和 GC 都感到苦恼,因为您每次都需要创建一个新实例。
那么为什么 Font 是不可变的引用类型呢?