Java中mutable类型和immutable类型
1. 前言
在学习软件构造这门课中无论是前期的软件构造基础,ADT(抽象数据类型),还是OOP(面向对象的编程),还是后期的可复用性和可维护性都需要我们对mutable类型和immutable类型有更深入的理解。
2. 概念
immutable类型:该类型变量一旦被创建就不能修改它的值。(不可变数据类型)
mutable类型:该类型变量被创建后可以通过一些类内部的方法改变其值。(可变数据类型)
3.举例
immutable类型:Sting类型是典型的immutable类型,不可改变,如下代码所示:
String s = "a";
s = s.concat("bc");//在a后添加bc
这段代码的内存表示,可以用diagram画出来
由图可知,改变s的内容,不是在原来s所指的内存空间加上bc,而是s指向了一块新的内存在里面添加修改过的内容。这就是immutable类型变量的特点,原来创建的内容会一直被保存,无法修改。
mutable类型:StringBuilder类型是典型的mutable类型,可以改变,如下代码所示
StringBuilder str = new StringBuilder("a");
str.append("bc");
这段代码内存表示的diagram:
由图可知,创建StringBuilder类的对象str,修改str的值是直接在原来的地址中直接添加,这就是mutable类型的特点,可以直接改变。
两种修改方式看上去都是把"a"修改为“abc”,但其实过程完全不同
考虑如下代码:
String str1 = s;
str1=str1+"bc";
StringBuilder str2 = str;
str2.append("bc");
str1是immutable类型在修改时不会改变s所指向地址的内容,而改变str2时,应为它是mutable类型,和str指向同一个地址空间,str的内容也会被改变,下次再引用str的值的时候会引起意想不到的错误。
4.两种类型的优缺点
immutable类型:
优点:
- 更安全,在开发软件过程中为了防止用户修改类,通常将类定义为immutable类型。
- 能被重复使用,因为地址中的内容从未被改变。
- 不需要保护性拷贝(Defensive Copy)
缺点:
- 对其频繁修改时,需要进行大量拷贝,浪费时间和存储空间
mutable类型:
优点:
- 适合于在多个模块之间共享数据
- 对其修改不会造成空间的浪费
缺点:
- 由于内部数据可以被改变,存在一定的风险,可能会返回意想不到的结果。
5.使用
在软件构造过程中我们经常定义immutable类型的类,因为我们不想让用户修改我们的属性,但如何保证自己定义的类是immutable类型的呢?只需满足如下条件:
1.类中所有属性都定义为private类型。
2.返回属性时进行copy,返回副本。
3.不提供直接修改属性的方法
4.使用final关键字修饰类
6.总结
对immutable类和mutable类的深入理解会对后面的学习起到很大的帮助,如有问题错误欢迎批评指正!