不可变的java对象

Luc*_*che 1 java design-patterns bigdecimal

今天在我阅读有关BigDecimal类的一些文档时,我偶然发现了一个基本属性,BigDecimal类是不可变的.

我怎么能向祖母解释不变性概念?

班级不变性的利弊是什么?

扩展类可以变得可变吗?

考虑到我想用我的类扩展BigDecimal:

`MyBigDecimal extends BigDecimal` 
Run Code Online (Sandbox Code Playgroud)

扩展是否违反了面向对象的基本设计原则?

ass*_*ias 9

我怎么能向祖母解释不变性概念?

检查这个问题:不可变的意思是什么

或者来自Effective Java:

不可变类是无法修改其实例的类.每个实例中包含的所有信息都在创建时提供,并在对象的生命周期内得到修复.


班级不变性的利弊是什么?

优点:

  • 它更容易推断出对象的状态,因为只有一个,即在初始化时构建的状态
  • 推论:不可变对象在并发编程中更容易使用,其中状态就是一切

缺点:

  • 当你想要改变对象的属性时,你需要创建一个新的=昂贵的
  • 施工可能更复杂(参见建筑师模式)

扩展类可以变得可变吗?

是 - 这就是为什么不可变类应该是最终的(或者,使所有构造函数都是私有的,并提供工厂来创建新对象).

BigDecimal是创建不可变类时应该做的事情的一个很好的例子(它可以扩展,这可能会导致你在问题中提到的问题).