当前位置: 首页 > 知识库问答 >
问题:

不变对象的缺点

龚博涛
2023-03-14

我知道不可变对象比可变对象有几个优点,比如它们比可变对象更容易推理,它们没有随时间变化的复杂状态空间,我们可以自由地传递它们,它们生成安全的哈希表键等等。所以我的问题是不可变对象的缺点是什么??

共有3个答案

华锦程
2023-03-14

我每天都在使用Scala。众所周知,不可变性有一些关键优势。然而,有时在某些情况下允许可变内容更容易。这里有一个人为的例子:

var counter = 0
something.map {e =>
  ...
  counter += 1
}

当然,我可以让地图返回一个包含有效负载和计数的元组,或者使用一个集合。尺寸(如有)。但在这种情况下,可变计数器可以说更加清晰。总的来说,我更喜欢不变性,但也允许自己做出例外。

咸昀
2023-03-14

除了可能的性能缺陷(可能!因为GC和热点优化的复杂性,不可变的结构不一定较慢)-一个缺陷是,状态现在必须贯穿整个应用程序。对于简单的应用程序或小型脚本,以这种方式维护状态的工作量可能太大,无法为您购买并发安全性。

例如,想象一下像Swing这样的GUI框架。完全使用不可变结构和一个主要的“不安全”外循环来编写GUI框架肯定是可能的,我猜这是在Haskell中完成的。保持嵌套不变状态的一些问题可以通过透镜来解决。但是管理所有的交互(注册监听器等)可能会涉及到很多问题,因此您可能会想引入新的抽象,比如功能反应式或混合反应式GUI。

基本上,由于完全不可变,你失去了一些OO的封装,当这成为一个问题时,有替代方法,比如actors或STM。

齐嘉庆
2023-03-14

引用有效Java:

不可变类唯一真正的缺点是,它们需要为每个不同的值创建一个单独的对象。创建这些对象的成本很高,尤其是如果它们很大的话。例如,假设你有一个一百万位的Bigintger,你想改变它的低阶位:

BigInteger moby = ...; 
moby = moby.flipBit(0);

flipBit方法创建了一个新的BigInteger实例,也有一百万位长,与原来的实例只有一位不同。该操作需要与BigInteger的大小成比例的时间和空间。将其与java进行对比。util。位集。与biginger类似,BitSet表示任意长的位序列,但与biginger不同,BitSet是可变的。BitSet类提供了一种方法,允许您在恒定时间内更改百万位实例的单个位的状态。

阅读第15项:最小化可变性的全部内容

 类似资料:
  • 问题内容: Java中不变对象的优点显而易见: 一致状态 自动线程安全 简单 您可以通过使用私有final字段和构造函数注入来支持不变性。 但是,在Java中偏爱不可变对象有哪些弊端? 即 与ORM或Web演示工具不兼容? 不灵活的设计? 实施的复杂性? 是否可以设计一个主要使用不可变对象的大规模系统(深层对象图)? 问题答案: 但是,在Java中偏爱不可变对象有哪些弊端?与ORM或Web演示工具

  • 问题内容: 我正在努力使可变对象与不可变对象有关。使用可变对象会带来很多负面影响(例如,从方法中返回字符串数组),但是我很难理解它的负面影响。使用可变对象的最佳实践是什么?您是否应尽可能避免使用它们? 问题答案: 好吧,这有几个方面。 没有参考身份的可变对象会在奇数时间导致错误。例如,考虑使用基于值的方法的 : 当实例用作键时,实例在映射中“丢失”,因为实例和相等性基于可变值。这些值在映射之外更改

  • 问题内容: 我想确保根据Java内存模型正确理解“有效不可变对象”的行为。 假设我们有一个可变的类,我们希望将其发布为有效的不可变的类: 我们执行以下操作: 问题是 :Java内存模型是否保证所有线程都必须具有? 根据 Java Concurrency In Practice, 这应该是正确的,但是如果我错了,请更正我。 3.5.3。安全出版惯用语 为了安全地发布对象,必须同时使对该对象的引用和该

  • 本文向大家介绍浅谈Python中的可变对象和不可变对象,包括了浅谈Python中的可变对象和不可变对象的使用技巧和注意事项,需要的朋友参考一下 什么是可变/不可变对象 不可变对象,该对象所指向的内存中的值不能被改变。当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址。 可变对象,该对象所指向的内存中的值可以被改变。变量(准确

  • 问题内容: 这是Java Concurrency in Practice中的一句话 共享的只读对象包括不可变的和实际上不可变的对象。 不变对象和有效不变对象之间有什么区别? 问题答案: 不可扩展且其字段全部为自身且不可变的类的实例是不可变的。 由于其方法的详细信息而无法更改其字段的类的实例实际上是不可变的。例如: 的某些实例实际上是不可变的,而有些则不是。 另一个例子是零长度数组。它们实际上是不可

  • 我遵循了以下基本的Spring批量教程https://spring.io/guides/gs/batch-processing/ . > 我正在使用IntelliJ 14并创建了一个Spring批处理项目 我在用Mavin。我还有pom。xml文件。 Mvn clean install运行良好,即使应用程序。java告诉我“无法自动连线。找不到JdbcTemplate类型的bean”@Autowi