标签: immutability

缺少Java中的不可变对象?

Java中不可变对象的优点似乎很清楚:

  • 一致的状态
  • 自动螺纹安全
  • 简单

您可以通过使用私有final字段和构造函数注入来支持不变性.

但是,在Java中支持不可变对象的缺点是什么?

  • 与ORM或Web演示工具不兼容?
  • 设计不灵活?
  • 实施复杂性?

是否有可能设计一个主要使用不可变对象的大规模系统(深层对象图)?

java immutability

32
推荐指数
2
解决办法
7968
查看次数

Clojure中的不可变队列

在Clojure中获取简单,高效的不可变队列数据类型的最佳方法是什么?

它只需要两个操作,用通常的语义排队和出列.

我当然考虑过列表和向量,但我知道它们在结尾和开始时的性能相对较差(即O(n)或更差) - 因此不适合排队!

理想情况下,我想要一个适当的持久数据结构,其中包含入队和出队操作的O(log n).

algorithm queue clojure immutability data-structures

32
推荐指数
2
解决办法
5882
查看次数

为什么我需要冻结JavaScript中的对象?

当有人需要Object.freeze在JavaScript中使用时,我不清楚.MDN和MSDN在有用时不提供真实的例子.我得到的部分是关于无法在运行时更改它,这是由崩溃强制执行的.问题是我什么时候才能体会到崩溃.

对我而言,不变性是一种设计时间约束,应该由类型检查器保证.

因此,在动态类型语言中发生运行时崩溃是否有任何意义,除了比以后更好地检测违规之外?

javascript immutability

32
推荐指数
5
解决办法
9493
查看次数

Haskell有变量吗?

我经常听说Haskell没有变量的说法; 特别是,这个答案声称它没有,它至少被投票了九次并被接受.

那么它是否有变量,为什么?

这个问题似乎也适用于ML,F#,OCaml,Erlang,Oz,Lava和所有SSA中间语言.

variables monads haskell immutability referential-transparency

31
推荐指数
3
解决办法
3万
查看次数

不可变性和XML序列化

一旦设置了初始值,我就有几个不可变的类.Eric Lippert称之为一次性写入不可变性.

在C#中实现一次写入不变性通常意味着通过构造函数设置初始值.这些值初始化只读字段.

但是,如果需要使用XmlSerializer或DataContractSerializer将类似这样的类序列化为XML,则必须具有无参数构造函数.

有没有人建议如何解决这个问题?是否有其他形式的不变性可以更好地与序列化?

编辑:正如@Todd所指出的,DataContractSerializer不需要无参数构造函数.根据MSDN上的DataContractSerializer文档,DataContractSerializer"不会调用目标对象的构造函数."

c# xml-serialization immutability

31
推荐指数
3
解决办法
4727
查看次数

如何在C#中声明一个局部常量?

如何在C#中声明一个局部常量?

与在Java中一样,您可以执行以下操作:

public void f(){
  final int n = getNum(); // n declared constant
}
Run Code Online (Sandbox Code Playgroud)

如何在C#中做同样的事情?我试着用readonlyconst,但没有一个似乎工作.

任何帮助将不胜感激.

谢谢.

c# local-variables readonly immutability

31
推荐指数
4
解决办法
1万
查看次数

如何在C#中创建不可变对象?

在关于C#模式验证的最佳实践的问题中,最高投票的答案是:

我倾向于在构造函数中执行所有验证.这是必须的,因为我几乎总是创建不可变对象.

你究如何在C#中创建一个不可变对象?你刚才用readonly关键字吗?

如果要在Entity Framework生成的模型类的构造函数中进行验证,这究竟是如何工作的?

它看起来像下面?

public partial readonly Person
{
    public Person()
}
Run Code Online (Sandbox Code Playgroud)

c# validation immutability entity-framework-4

31
推荐指数
4
解决办法
3万
查看次数

Google Go语言中哪些类型是可变的和不可变的?

在Google Go中,我读到字符串是不可变的,好吧但是是int?其他类型呢?作为一个稍微老一点的程序员,我更喜欢可变性,即使我知道不变性的好处,我更喜欢生活危险.

知道哪些类型是可变的或不可变的将是非常有帮助的.


更新,我最关心的是实际问题取决于类型是可变的还是不可变的.与Java中的典型示例一样,如果在循环中创建一个String并循环10,000次,则将创建10,000个String,然后进行垃圾回收.在我工作的公司的项目中,这实际上是一个严重的问题.

问题是,Go的不变性在某些情况下会导致同样的问题吗?

它会影响你应该如何对待var.(或者我认为它确实如此).


再次更新,我也关注其他实际问题.知道某些东西是不可变的意味着我可以编写并行的代码,并且对该对象的一个​​引用的更新不应该更新其他引用.但有时候我想做危险的事情,我想要变性.

这些是可变性与不变性的结果,并影响我如何编写代码.

immutability go mutability

31
推荐指数
2
解决办法
2万
查看次数

替换元素中特定位置的元素而不改变它

如何在不改变数组的情况下完成以下操作:

let array = ['item1'];
console.log(array); // ['item1']
array[2] = 'item2'; // array is mutated
console.log(array); // ['item1', undefined, 'item2']
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,array变量是变异的.如何在不改变阵列的情况下执行相同的操作?

javascript arrays immutability ecmascript-6

31
推荐指数
6
解决办法
3万
查看次数

懒惰和并行性如何在Haskell中共存?

人们认为Haskell在并行性方面具有优势,因为它具有不变的数据结构。但是Haskell也很懒。这意味着实际上可以将数据从thunk突变为评估结果。

因此,懒惰似乎会损害不变性的优势。我是错的还是Haskell有针对此问题的对策?还是这是Haskell的特色?

parallel-processing haskell immutability lazy-evaluation

31
推荐指数
1
解决办法
1296
查看次数