Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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_Design Patterns_Bigdecimal - Fatal编程技术网

不可变java对象

不可变java对象,java,design-patterns,bigdecimal,Java,Design Patterns,Bigdecimal,今天我在阅读一些关于BigDecimal类的文档时, 我偶然发现了一个基本属性,BigDecimal类是不可变的 我该如何向祖母解释不变性的概念 类的不变性有哪些优点和缺点 扩展类可以变吗 考虑到我想用我的类扩展BigDecimal: `MyBigDecimal extends BigDecimal` 扩展是否违反了基本的面向对象设计原则 类的不变性意味着,如果创建了对象,则不能更改其内容 考虑例如 String str = "Hello"; // you can not change co

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

我该如何向祖母解释不变性的概念

类的不变性有哪些优点和缺点

扩展类可以变吗

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

`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