在阎宏博士的《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. Ubuntu16.04安装配置和使用ctags

    Ubuntu16.04安装配置和使用ctags by ChrisZZ ctags可以用于在vim中的函数定义跳转.在ubuntu16.04下默认提供的ctags是很老很旧的ctags,快要发霉的版本( ...

  2. python---实现多个有序列表的合并

    我觉得不用抄书上的代码. 遇到实现问题,应该结合python本身的功能去解决. 比如,当合并有序列表时,为什么一定要一项一项比较,而不是使用list的sort函数呢? # coding = utf-8 ...

  3. linux shell基本知识

    shell script的一些注意事项: .#这个符号是注释本行,通常用来做批注用,#!除外,是用来标注用哪种shell执行本脚本, .执行顺序为从上到下,从做到右 .忽略空行,tab空格 .脚本换行 ...

  4. 如何在grails2.3.x中的fork模式下进行调试?-【grails】

    grails2.3.x中默认情况下运行模式被设置成了fork模式,在这种模式下,大家会发现设置了断点后无法进行中断.这是由于fork模式造成的,因为在fork模式下,JVM新起了一个进程,这样调试器就 ...

  5. k8s 英文文档翻译

    https://medium.com/google-cloud/understanding-kubernetes-networking-pods-7117dd28727 

  6. 010 pandas的DataFrame

    一:创建 1.通过二维数组进行创建 2.取值 取列,取位置的值 3.切片取值 这个和上面的有些不同,这里先取行,再取列 4.设定列索引 这里使用的行索引与上面不同. 5.通过字典的方式创建 6.索引 ...

  7. day23 面向对象 函数和方法区分

    最近两周内容大概回顾: # 文件操作 # # 模块:random,序列化模块,时间模块,collections,re,os,sys # 模块与包的概念和导入方法 # 写代码的规范 # 正则表达式 # ...

  8. instance of的java用法

    http://blog.csdn.net/liranke/article/details/5574791

  9. TensorFlow图像预处理-函数

    更多的基本的API请参看TensorFlow中文社区:http://www.tensorfly.cn/tfdoc/api_docs/python/array_ops.html 下面是实验的代码,可以参 ...

  10. TF之RNN:TensorBoard可视化之基于顺序的RNN回归案例实现蓝色正弦虚线预测红色余弦实线—Jason niu

    import tensorflow as tf import numpy as np import matplotlib.pyplot as plt BATCH_START = 0 TIME_STEP ...