软件构造笔记---Java中mutable类型和immutable类型

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类的深入理解会对后面的学习起到很大的帮助,如有问题错误欢迎批评指正!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值