Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么不变性是类中需要的特性?_Java_Immutability - Fatal编程技术网

Java 为什么不变性是类中需要的特性?

Java 为什么不变性是类中需要的特性?,java,immutability,Java,Immutability,我读过很多地方的文章,其中写到java中的不变性是一个理想的特性。为什么会这样?不变性使我们更容易对对象的生命周期进行推理。它在多线程程序中特别有用,因为它使线程之间的共享更加简单 一些数据结构假定键或元素是不可变的,或者没有以关键方式进行更改。e、 g.地图和集合。它们不一定是严格不变的,但如果它们是不变的,那么就容易多了 不可变对象的缺点是它使回收它们变得更加困难,并且会显著影响性能 简而言之,如果性能是一个问题,考虑可变对象,如果不尽可能地使用不可变的对象。当你需要知道一个类在你不期望的时

我读过很多地方的文章,其中写到java中的不变性是一个理想的特性。为什么会这样?

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

一些数据结构假定键或元素是不可变的,或者没有以关键方式进行更改。e、 g.地图和集合。它们不一定是严格不变的,但如果它们是不变的,那么就容易多了

不可变对象的缺点是它使回收它们变得更加困难,并且会显著影响性能


简而言之,如果性能是一个问题,考虑可变对象,如果不尽可能地使用不可变的对象。当你需要知道一个类在你不期望的时候没有改变时,就非常希望

不可变性。考虑哈希图中的键。如果您为一个键设置了一个可变对象,然后将其存储在该键的当前哈希值(mod hash array size)处,当您更改它时会发生什么?散列改变了,突然它在错误的位置!你(HashMap)不知道它已经改变了,所以你不知道更新它的位置,所以下次有人试图查找该键时,你将找不到它。不变性消除了这个问题——如果您根据对象的散列将对象放在某个位置,您知道它将始终位于您期望的位置

而且,正如其他地方所指出的,不可变意味着可以在不同步的情况下并发读取多个线程。

有效的Java Item 15不可变类比可变类更易于设计、实现和使用。他们不那么容易上瘾
不可变性的主要好处是对象不能“从您的下方”更改。例如,考虑一个字符串,这是一个地图的关键。如果它是可变的,那么可以插入一个键/值对,然后修改作为键的字符串。这将破坏映射中使用的哈希方案,并导致一些可能非常不可预测的操作

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


(另一方面,创建了很多对象,例如,当有人附加到字符串或“切掉”字符串的一部分时,会创建一个新字符串,而不是简单地修改现有字符串,因此这两种方法最终都会由于不同的原因创建更多的对象。)

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

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

  • 线程安全
  • 比可变对象更安全
  • 简朴

  • 为了更好地理解java类和对象的不变性,您可以回顾一个例子,您可能会对“不可变”==“线程安全”感兴趣。rock也是线程安全的。这个问题的目的与线程安全无关。这个问题可能有其他重复的地方,但有一些问题通常适用于类,这些问题超出了仅与字符串相关的那些问题。我想说一下为什么?为什么“-1”??我希望这个标记不是一成不变的。。。答案是好的,这不是一个完美的答案,但如果人们认为答案是错误的,但却不试图纠正、澄清或改进它,我会感到恼火。这个网站的全部目的是学习一些东西。我更喜欢给予建设性的批评,而不是否决投票。我唯一一次否决投票是如果我同意已经发表的评论。@PeterLawrey:我不会说不变性使人们更容易对对象的生命周期进行推理,而是在许多情况下,它使生命周期变得无关紧要。垃圾收集对于不可变对象远比对于可变对象有用(事实上,如果我设计一个小型嵌入式框架,我可能会对不可变对象使用Java风格的GC,对可变对象使用Objective-C风格的ref计数)。在许多情况下,可变对象应该有一个定义良好的所有者,并且有用的生命周期与该所有者相关联。不可变对象没有所有者;他们只是存在,但这并不能确切说明原因。