在阎宏博士的《JAVA与模式》一书中开头是这样描述不变(Immutable)模式的:一个对象的状态在对象被创建之后就不再变化,这就是所谓的不变模式。

  不变模式的结构

  不变模式可增强对象的健壮性(robustness)。不变模式允许共享某一个对象,降低了并发访问该对象的同步开销。如果需要修改一个不变对象的状态,则需要建立一个新的同类型对象,并在创建时把这个新的状态存储在新对象里。不变模式只涉及到一个类。一个类的内部状态创建后,在整个生命周期都不会发生变化,这样的类称为不变类。使用不变类的做法叫不变模式。不变模式有两种形式:弱不变模式和强不变模式。

  弱不变模式

  一个类的实例状态是不可变的,但是这个类的子类的实例状态可能会变化。这样的类符合弱不变模式。要实现弱不变模式,一个类必须满足下面3个条件:

  1 通过构造函数初始化对象状态后,对象状态不再改变。

  2 所有属性都是私有的。

  3 防止外界修改相关的其他可变对象,尽量在不变对象内部初始化这些对象。

  弱不变模式的缺点:

  1 一个弱不变对象的子对象可能是可变的。

  2 可变的子对象可能会修改父对象的状态,从而可能会从外界修改父对象的状态。

  强不变模式

  一个类的实例状态不会改变,它的子类的实例状态也不会改变。这样的类符合强不变模式。要实现强不变模式,一个类必须首先满足弱不变模式要求的所有条件,并且要满足下面条件之一:

  1 类所有的方法都是final,这个类的子类无法重写父类方法。

  2 类本身是final,这个类就不会有子类。

  “不变”和“只读”的区别

  当一个变量是“只读”时,变量的值不能直接改变,可以在其他变量改变时改变。例如,一个人的出生年月日是“不变”属性,而一个人的年龄是“只读”属性,不是“不变”属性。

  不变模式在Java中的应用

  最著名的是java.lang.String类。它是一个强不变类型,举例:

 String a = "test";
String b = "test";
String c = "test";

  Java虚拟机只会创建一个字符串实例,而这3个String对象共享这一个值。

  

  不变模式的优点

  不变对象可以节省同步开销,比可变对象更加容易维护。

  不变模式的缺点

  如果需要修改一个不变对象的状态,就只能创建一个新的同类对象,容易出现资源浪费。

  所以,只有对象状态不可能改变,才能把它设计成不变类。

  参考资料

  《JAVA与模式》之不变模式

Java 不变模式的更多相关文章

  1. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  2. JAVA设计模式之不变模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述不变(Immutable)模式的: 一个对象的状态在对象被创建之后就不再变化,这就是所谓的不变模式. 不变模式的结构 不变模式可增强对象的 ...

  3. Java并发程序设计(九)设计模式与并发之不变模式

    设计模式与并发之不变模式 使用不变模式的目的:除去多线程中的同步操作,提高并行程序的性能. 一个类在的内部状态创建后,在整个生命周期内都不会发生改变,该类就是不变类. /** * @author: T ...

  4. 《JAVA与模式》之不变模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述不变(Immutable)模式的: 一个对象的状态在对象被创建之后就不再变化,这就是所谓的不变模式. 不变模式的结构 不变模式可增强对象的 ...

  5. Java设计模式(14)——行为模式之不变模式(Immutable)

    一.概述 概念 分类:弱不变模式(子类可变)和强不变模式(子类也是不可变) 应用场景 java.lang.String是一个经典的强不变类 二.分析 与享元模式的关系

  6. Java 程序优化 (读书笔记)

    --From : JAVA程序性能优化 (葛一鸣,清华大学出版社,2012/10第一版) 1. java性能调优概述 1.1 性能概述 程序性能: 执行速度,内存分配,启动时间, 负载承受能力. 性能 ...

  7. 千回百折:百度Java研发offer斩获记和经验分享

    起因 面试过程 等待offer的过程中悟道 Java面试常考知识点个人总结 过程 百度——作为国内互联网的巨头之一,最近的一些风波对其褒贬不一,但是类似事件不是第一次发生,也绝对不是最后一次,对于真的 ...

  8. <代码整洁之道>、<java与模式>、<head first设计模式>读书笔记集合

    一.前言                                                                                       几个月前的看书笔记 ...

  9. java.lang.String

    1.String 是一个类,广泛应用于 Java 程序中,相当于一系列的字符串.在 Java 语言中 strings are objects.创建一个 strings 最直接的方式是 String g ...

随机推荐

  1. 纯css3实现的switch开关按钮

    效果如图 <p> <label><input class="mui-switch mui-switch-anim" type="checkb ...

  2. 在 Windows服务器中启用/禁用SMBv1、SMBv2和SMBv3的方法

    本文介绍如何在 SMB 客户端和服务器组件上启用/禁用服务器消息块 SMBv1.SMBv2 和 SMBv3. 注意:建议由专业技术工程师完成以下操作. 禁用 SMBv2 和 SMBv3 的影响 我们建 ...

  3. Ueditor设置默认字体、字号、行间距,添加字体种类(转)

    Ueditor默认字体.字号.行间距的修改: ueditor默认字号是16号,默认字体为sans-serif,默认行间距为5px,如下图所示: 首先,修改ueditor.all.js文件中如上图红框中 ...

  4. javascript OOP(下)(九)

    一.javascript模拟重载 java中根据参数类型和数量的区别来实现重载,javascript弱类型,没有直接的机制实现重载,javascript中参数类型不确定和参数个数任意,通过判断实际传入 ...

  5. signal() 和 sigaction()

    [摘自<Linux/Unix系统编程手册>] Unix系统提供了两种方式来改变信号处置:signal() 和 sigaction(). signal() 的行为在不同Unix实现间存在差异 ...

  6. SPOJ 1812 LCS2

    题解: 和上一题差不多 每个点记录前面的到这个点的最大值 初值赋为len[i] 然后注意要用子节点更新父节点 代码: #include <bits/stdc++.h> #define ll ...

  7. ubuntu ibus pinyin输入法异常

    http://blog.csdn.net/granvillegao/article/details/41115211 命令行运行 ibus-setup 在常规页面,取消了“在应用程序窗口中启用内嵌编辑 ...

  8. 【Android】Android处理Home键方法小结

    实验几次之后(android4.1 和android4.2)发现在单个的activity里面有以下几个方法可以使用: 方法1:onSaveInstanceState方法 下面这个方法可以处理home的 ...

  9. MySQL常用引擎的锁机制

    一.引言                                                                                                 ...

  10. ionic2中使用moment.js

    安装 npm i moment --save 使用 import { Pipe, PipeTransform } from '@angular/core'; import Moment from 'm ...