【软构】Mutable&Immutable类型

文章目录

  • 前言
  • 一、Mutable类型
  • 二、Immutable类型
  • 三、两种类型的使用对比
  • 四、构造一个Immutable类型的类
  • 总结


前言

在软件构造中常常区分两种数据的两种类型,一种是`mutable`类型,另一种是`immutable`类型。`mutable`类型提供了可以改变其内部数据值的操作,其内部的值可以被重新更改。而`immutable`类型内部没有改变属性值的操作,当外部代码改变某一`immutable`类型的值时,将会构造一个新的对象而非对原来的值进行更改。

一、Mutable类型

Mutable表示能够改变其值的类型。某个引用更改其数据的值时指向内存中同一位置,其他对该数据的引用都会发生变化。直观地说,就是操作直接作用于该对象,并使该对象发生了变化。

例如,在Java中,描述一个点的类型Pointmutable的,更改一个Point类型的对象P时,会直接更改当前对象在内存中的内容,如下图所示。
【软构】Mutable&Immutable类型_第1张图片

二、Immutable类型

Immutable类型表示不能够改变其值的类型。这里不能够改变其值指的是不能直接修改一个Immutable对象在内存中的内容,如果想要对这个对象中的属性值进行更改,会利用新的属性值创造一个新的对象,在内存中形成另外的空间来存储。直观地说,就是操作不直接改变当前对象,而是改变一个新的对象。在Java中基本类型及其封装对象类型都是不可变的。

例如,在Java中,描述字符串的String类型是Immutable的,更改一个String类型的对象str时,str会引用一个新的String对象而不是把原来对象的值改变,如下图所示。
【软构】Mutable&Immutable类型_第2张图片

三、两种类型的使用对比

空间方面:不可变类型频繁更改内容会产生大量垃圾占用空间,需要频繁的垃圾回收;而可变类型最少化拷贝,可以提高效率。

性能上:可变数据类型能够带来更好的性能,可以在多个模块间便捷地共享数据,如全局变量等。

安全上:不可变类型能够带来更高的安全性,不同模块更改对象属性时会新建一个对象而不是更改原来的对象,不会影响引用原来的对象的那些模块,杜绝了出现一些意想不到的错误。而可变类型可能造成风险,通常会通过防御式拷贝(也叫深度拷贝),向客户端返回一个全新的可变类型的对象,但是该拷贝一般不会被客户端修改, 可能造成大量的内存浪费。

四、构造一个Immutable类型的类

1)首先该类的属性可以是private final 变量名的形式,final使得这些属性一经创造就不能更改,而且private保证这些属性不能被外部代码直接访问。当然也可以不加final,那样该类的Observer观察器应该按照3)来实现

2)类中不含有改变属性的Setter这类方法。

3)如果类中存在mutable类型的属性,则初始化该属性或者使用类中的Getter方法从外部对其进行观察的时候,应该使用防御式拷贝的方式。

总结

Mutable与Immutable类型的概念和区别以及Immutable类的构造。

你可能感兴趣的:(软件构造)