为什么不变性是课程中的理想特征?

时间:2013-03-10 03:06:11

标签: java immutability

我已经阅读了很多地方,其中写道java中的不变性是一个理想的功能。为什么会这样?

5 个答案:

答案 0 :(得分:4)

不变性使得更容易推断对象的生命周期。它在多线程程序中特别有用,因为它使得在线程之间共享更加简单。

某些数据结构假设键或元素是不可变的,或者不会以关键方式更改。例如地图和集。它们不一定是严格不变的,但如果它们更容易使它变得容易。

不可变对象的缺点在于它使得回收它们变得更加困难并且可以显着影响性能。

简而言之,如果性能是一个问题,请考虑可变对象,如果不尽可能使用不可变对象。

答案 1 :(得分:3)

不变性的主要好处是对象不能“从你身下”改变。例如,考虑一个String,它是Map的关键。如果它是可变的,则可以插入一个键/值对,然后修改作为键的String。这会破坏映射中使用的哈希方案,并导致一些可能非常不可预测的操作。

在某些情况下,由于故意滥用,这种可变性可能导致安全风险,但更常见的是它只会导致神秘的错误。并且“防御性”复制可变对象(以避免此类错误)将导致创建更多对象(特别是如果采用公式化方法)。

(另一方面,创建了很多对象,例如,因为当有人追加到String时会创建一个新的String,或者“切掉”它的一部分,而不是简单地改变现有的String,所以这两种方法都是最终导致更多对象被创建,原因各不相同。)

答案 2 :(得分:2)

当你需要知道一个班级在你没想到的时候没有改变时,非常需要不变性。考虑哈希映射中的键。如果为键设置了一个可变对象,则将其存储在键的当前哈希值(mod哈希数组大小)中,更改时会发生什么?哈希变化,突然间它出现在错误的位置!你(HashMap)不知道它已经改变了,所以你不知道更新它的位置,所以下次当有人试图查找那个键时你就找不到了。不变性消除了这个问题 - 如果你根据它的哈希值把对象放在某个地方,你知道它总是在你期望的位置。

而且,正如其他地方所指出的那样,不可变意味着在没有同步的情况下从多个线程并发读取是安全的。

答案 3 :(得分:1)

在编程中,不可变类或对象是在创建状态后无法修改其状态的对象。在某些情况下,即使您可以更改其属性(字段),它们仍被视为不可变,但对象性质保持不变。

通常需要不可变对象,因为有三个主要原因:

  1. 线程安全
  2. 比可变对象更高的安全性
  3. 简单
  4. 您可以查看ref.以更好地了解java类和对象的不变性

答案 4 :(得分:0)

有效的Java Item 15 不可变类比可变类更容易设计,实现和使用。它们不太容易发生 错误,更安全。