问题标签 [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# - 在深度不可变类型上进行延迟初始化是否需要锁?
如果我有一个非常不可变的类型(所有成员都是只读的,如果它们是引用类型成员,那么它们也指的是非常不可变的对象)。
我想在类型上实现一个惰性初始化属性,如下所示:
据我所知:
...是线程安全的。我不太担心两个线程都竞相同时初始化,因为这种情况很少见,从逻辑角度来看,两个结果都是相同的,如果我没有,我宁愿不使用锁到。
这行得通吗?优缺点都有什么?
编辑: 感谢您的回答。我可能会继续使用锁。然而,令我惊讶的是,没有人提出编译器意识到临时变量是不必要的,只是直接分配给 m_PropName 的可能性。如果是这种情况,那么读取线程可能会读取尚未完成构造的对象。编译器会阻止这种情况吗?
(答案似乎表明运行时不允许这种情况发生。)
编辑: 所以我决定采用受 Joe Duffy 的这篇文章启发的 Interlocked CompareExchange 方法。
基本上:
这应该确保在此对象实例上调用此方法的所有线程都将获得对同一对象的引用,因此 == 运算符将起作用。可能会浪费工作,这很好 - 它只是使它成为一个乐观的算法。
正如下面的一些评论所指出的,这取决于 .NET 2.0 内存模型的工作。否则,应将 m_PropName 声明为 volatile。
java - 如何在 Clojure 中使 Java 类不可变?
我想将 java 的 PriorityQueue 类包装在 clojure 中,以便在我的程序的另一部分中使用。我想弄清楚的是,是否有任何方法可以以 lispy 的方式执行此操作并使优先级队列不可变。有什么好的方法可以做到这一点,或者我只是将 PriorityQueue 用作可变数据结构会更好?
.net - 不可变对象的约定
当你设计不可变类时,你更喜欢:
或者
对我来说,#1 似乎更直观,而不是 #2,它看起来像是修改了引用的对象,因为它是一个实例方法,它还不如改变内部结构,对吧?
language-design - 可变或不可变闭包
在命令式、面向对象的语言中,具有可变或不可变闭包是否更有意义?
例如:
如果闭包是可变的,这将打印:
如果它是不可变的,它将打印:
我意识到即使使用不可变的闭包,您仍然可以这样做:
那么,拥有可变闭包或不可变闭包会更好,还是两者都有选择?不可变闭包似乎更容易实现,所以在这一点上,我想我会继续这样做,除非有充分的理由不这样做。
c# - 您期望不可变列表的不变性有多深?
如果你有一个不可变的列表,你希望它在你请求时总是返回对同一个对象的引用,比如
我的问题是,您是否希望能够对对象进行变异并在下次从列表中获取它时反映该变异?
java - Java中的持久数据结构
有谁知道一个库或至少有一些关于在 Java 中创建和使用持久数据结构的研究?我不将持久性称为长期存储,而是将持久性称为不变性(参见Wikipedia entry)。
我目前正在探索为持久结构建模 api 的不同方法。使用构建器似乎是一个有趣的解决方案:
但这仍然让人感觉有些样板。有任何想法吗?
python - Python 中的不变性和线程安全
我正在清理我在……不那么知识渊博时编写的一些 Python 代码。主要是因为对 Python 中的线程的不完全理解而产生的一些复杂性。我需要制作一个线程安全的项目列表,并且我想通过不可变列表来完成它,而不是通常的锁定方法。我知道不可变对象在线程方面非常特殊,因为围绕不完整状态更改的所有线程安全问题都会消失。
所以,我问:下面的代码是线程安全的吗?
我认为是,因为每次都会构建一个新列表。如果在另一个线程迭代列表时更新了列表,则旧列表将继续用于剩余的迭代。这对我来说很好,但可能并不适合所有人。
另外,这是个好主意吗?我只想将此应用于列表大小较小且列表没有太大变化的少数情况(事件侦听器会浮现在脑海中)。
immutability - 存储库和不可变对象?
我可能会因阻抗不匹配而注定要失败,但我正在尝试协调我在 IRepository 和不可变对象中看到的示例。
我正在开发一个编目应用程序,其中数百个 Web 请求在产品的“工作集”上运行——整个目录的一个子集往往在任何给定时间都在发挥作用。
同时,我们的数据团队不断更新产品数据——新图片、更新价格、描述等。
在我看来,就性能而言,我最好将产品视为不可变的。它们由存储库加载和缓存,并且许多线程可以同时访问同一个产品对象。
但是这个想法似乎与我看到的许多使用 Update/Delete 方法的 IRepository 示例不同——只要线程可以写入产品,似乎我就会对比赛和其他讨厌的事情敞开心扉。
因此,我设想了一个“编辑器”模型,其中通过伴随的“编辑器”对象对实体进行更改,然后保持更改并强制重新加载相关产品以供所有人使用。产品永远不会改变 - 只是在外部“编辑”并重新加载。
这有道理吗?正如我所看到的那样,这可以与存储库一起使用吗?
java - Java中不可变对象的缺点?
Java 中不可变对象的优势似乎很明显:
- 一致状态
- 自动线程安全
- 简单
您可以通过使用私有最终字段和构造函数注入来支持不变性。
但是,在 Java 中偏爱不可变对象有什么缺点呢?
IE
- 与 ORM 或 Web 演示工具不兼容?
- 不灵活的设计?
- 实施复杂性?
是否可以设计一个主要使用不可变对象的大规模系统(深度对象图)?
java - 从 javabean 创建不可变对象
我参与了这个项目,我们正在构建大量遗留代码。我有一个关于必须通过网络传输的大型 java bean 对象的特殊情况。所以我的第一个想法是让它不可变和可序列化来做这个把戏。在这一点上,我面临着一些困难的选择:-
理想情况下,我想要某种方法来自动生成此类的不可变、可序列化版本。我没有以任何方式重构或更改此类的范围,我真的很讨厌必须复制粘贴具有不同名称的类?
假设我放弃了 1 即我实际上选择了复制 HUGE javabean 类的代码,我仍然会处于不得不编写一个带有 20-25 个参数的构造函数以使这个类不可变的糟糕情况。除了构造函数注入之外,使类不可变的更好方法是什么?
谢谢并恭祝安康,