不可变java对象
今天我在阅读一些关于BigDecimal类的文档时, 我偶然发现了一个基本属性,BigDecimal类是不可变的 我该如何向祖母解释不变性的概念 类的不变性有哪些优点和缺点 扩展类可以变吗 考虑到我想用我的类扩展BigDecimal:不可变java对象,java,design-patterns,bigdecimal,Java,Design Patterns,Bigdecimal,今天我在阅读一些关于BigDecimal类的文档时, 我偶然发现了一个基本属性,BigDecimal类是不可变的 我该如何向祖母解释不变性的概念 类的不变性有哪些优点和缺点 扩展类可以变吗 考虑到我想用我的类扩展BigDecimal: `MyBigDecimal extends BigDecimal` 扩展是否违反了基本的面向对象设计原则 类的不变性意味着,如果创建了对象,则不能更改其内容 考虑例如 String str = "Hello"; // you can not change co
`MyBigDecimal extends BigDecimal`
扩展是否违反了基本的面向对象设计原则
类的不变性意味着,如果创建了对象,则不能更改其内容
考虑例如
String str = "Hello"; // you can not change content Hello to any other string
类的不变性的利弊
扩展类可以变吗
是的,你能做到
MyBigDecimal扩展了BigDecimal
您可以这样做BigDecimal
不是最终版本
类的不变性意味着,如果创建了对象,则不能更改其内容
考虑例如
String str = "Hello"; // you can not change content Hello to any other string
类的不变性的利弊
扩展类可以变吗
是的,你能做到
MyBigDecimal扩展了BigDecimal
您可以这样做BigDecimal
不是最终版本
我该如何向祖母解释不变性的概念
检查此问题:
或来自有效Java:
不可变类是其实例无法修改的类。每个实例中包含的所有信息在创建时提供,并在对象的生命周期内固定
类的不变性有哪些优点和缺点
优点:
- 更容易对对象的状态进行推理,因为只有一种状态,即建立在初始化基础上的状态
- 推论:不可变对象更容易在并发编程中使用,其中状态就是一切
缺点:
- 如果要更改对象的属性,则需要创建一个新属性
- 构造可能更复杂(cf builder模式)
扩展类可以变吗
是-这就是为什么不可变类应该被设置为final(或者,将所有构造函数设置为私有,并提供工厂来创建新对象)
BigDecimal是一个很好的例子,说明了在创建不可变类时应该而不是做什么(可以对其进行扩展,这可能会导致问题,正如您在问题中提到的)
我该如何向祖母解释不变性的概念
检查此问题:
或来自有效Java:
不可变类是其实例无法修改的类。每个实例中包含的所有信息在创建时提供,并在对象的生命周期内固定
类的不变性有哪些优点和缺点
优点:
- 更容易对对象的状态进行推理,因为只有一种状态,即建立在初始化基础上的状态
- 推论:不可变对象更容易在并发编程中使用,其中状态就是一切
缺点:
- 如果要更改对象的属性,则需要创建一个新属性
- 构造可能更复杂(cf builder模式)
扩展类可以变吗
是-这就是为什么不可变类应该被设置为final(或者,将所有构造函数设置为私有,并提供工厂来创建新对象)
BigDecimal是一个很好的例子,说明了在创建一个不可变类时不应该做什么(它可以被扩展,这可能会导致问题,正如您在问题中提到的)。一个实例永远不会更改的不可变类。对象的状态是在构建时定义的,在构建后不会更改
为了正确地保持不变,该类不提供任何方式(反射除外)来更改其状态:没有setter方法,没有更改其内部状态的方法,没有允许访问其持有的可变字段的方法。它也应该是最终的(正如BigDecimal应该是),以防止任何其他类扩展它,从而通过添加可变字段使其可变
优点有很多:
- 这门课很容易理解
- 实例本身就是线程安全的
- 可以缓存实例,而无需从缓存返回副本
- 实例可以用作地图中的关键点,而不必担心被更改
它没有违反OO原则:相反,状态完全封装在对象中
注意:某些不可变对象在内部更改其状态(例如,某些字段的延迟初始化),而不影响对象的外部可见状态。如果操作得当,它不会改变不可变对象的线程安全性。如果操作不正确,会使它们成为非线程安全的。一个实例永远不会更改的不可变类。对象的状态是在构建时定义的,在构建后不会更改
为了正确地保持不变,该类不提供任何方式(反射除外)来更改其状态:没有setter方法,没有更改其内部状态的方法,没有允许访问其持有的可变字段的方法。它也应该是最终的(正如BigDecimal应该是),以防止任何其他类扩展它,从而通过添加可变字段使其可变
优点有很多:
- 这门课很容易理解
- 实例本身就是线程安全的
- 可以缓存实例,而无需从缓存返回副本
- 实例可以用作地图中的关键点,而不必担心被更改
它没有违反OO原则:相反,状态完全封装在对象中
注意:某些不可变对象更改其状态inte