2016-02-16 17 views
-2

很明显,不可变对象应该在大多数时间和任何可能的时候使用。 编辑当不可变对象不能在java中使用时,最好使用mutable?

这里有一些文章来鼓励这种做法: https://docs.oracle.com/javase/tutorial/essential/concurrency/immutable.html

  • 是简单的构建,测试和使用
  • 是自动线程安全的,并没有同步问题
  • 不需要拷贝构造函数
  • 不需要实现克隆
  • 允许的hashCode使用延迟初始化,并缓存它的返回值
  • 不需要被防守复制为现场使用时
  • 好好地图键和SET元件(这些对象不能改变 状态,而在收集)
  • 有自己的班级不变的构造时建立的一次,它 永远需要再次检查
  • 始终有“失败原子”(由约书亚布洛赫所使用的术语):如果一个 不可变对象抛出例外,它从来没有留在 不受欢迎的或inde终止状态

http://www.javapractices.com/topic/TopicAction.do?Id=29

但是在那里场景中不变的对象都不好使用或不能使用某种原因?基于

+4

为什么显而易见的是不可变对象最应该被使用? – Maroun

+0

*然而,有些情况下,不可变对象不适合使用或由于某种原因不能使用*? - 简单。您的设计阻止您创建实例*不可变*。这一切都归结于设计。如果你的设计允许你,那么使实例不可改变,因为它们可以提高性能并防止不必要的状态变化 – TheLostMind

+0

带引号的文本*没有声明不可变对象应该用得最多。 – Maroun

回答

1

思考框架是由一个不可改变的对象,因为他们需要构造函数注入复杂:

在Java中,这迫使我们始终提供所有必要的依赖没有默认参数 构造压倒一切的可能是肮脏的 构造函数参数名称通常不能通过反射获得,这迫使我们依赖于参数顺序来依赖于分辨率

具有不变性,任何时候您需要修改数据时,都需要创建一个新对象。这可能是昂贵的。假设需要修改消耗数兆字节内存的对象中的一个位:您需要实例化一个新对象,分配内存等。如果需要多次执行此操作,可变性将变得非常有吸引力。

+0

构造函数注入不考虑改变状态。它提供了对象构造的价值。 – Adelin

1

当然有很多。简单的情况是当你想修改对象的状态。

与Person对象的name属性一样。

如果Person类对象不可变,那么您需要使用name属性的新值创建一个新对象。它带来了创建一个新的Person项目的开销。有时不可变的对象会提高性能。就像在线程中一样。

如果Person类是可变的,那么您需要做的就是使用setter方法更改状态。不需要创建新的对象。但在多个线程中使用可能不安全。

如果安全性需要在更改状态之前进行检查,而不是跨领域问题,并且不属于Person类。

java中的String类也是不可变的。 public final class String。这就是为什么你需要StringBuffer & StringBuilder类来创建可变字符序列。

还有许多框架如Hibernate recommends non-final classes。所以最终会创建更多的可变类来产生可变对象。

它最好分析上下文或场景,并在可变或不可变之间进行选择。

相关问题