在阎宏博士的《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. 上手TensorFlow

    tensorflow中softmax_cross_entropy和sparse_softmax_cross_entropy的区别 都是softmax cross entropy损失函数,区别在于lab ...

  2. 安装淘宝npm(cnpm)

    https://www.cnblogs.com/yominhi/p/7039795.html http://npm.taobao.org/ 初始化一个 mpvue 项目 现代前端开发框架和环境都是需要 ...

  3. SQL Server Profiler的简单使用

    SQL Server Profiler可以检测在数据上执行的语句,特别是有的项目不直接使用sql语句,直接使用ORM框架的系统处理数据库的项目,在调试sql语句时,给了很大的帮助. 之前写了使用SQL ...

  4. 实战--Keepalived和LVS实现负载高可用

    显然,只有上一篇的操作,在WEB运维技术中,只能承担一半的角色. 想像一下,如何LVS本身倒了,肿么办?后端的NGINX再多,也只能是干着急,请求过来不呀! 所以,在本篇时,我们来实现LVS永不倒, ...

  5. jQuery字体缩放缩放插件zoomFontSize.js

    插件描述:jQuery字体缩放缩放插件zoomFontSize.js根据父类进行百分比缩放,兼容性如下: 使用方法 body 的class属性 添加 changbody_fontSize 而且整个页面 ...

  6. WebApi参数传递实例

    Get 1.基础数据类型 1.1方法只含有一个形参 (1)Get传值的本质是通过url字符串拼接(2)Get传递参数本质是url字符串拼接,Request-Head头部传递,Request-Body中 ...

  7. go-关于指针和地址

    经常会见到: p . *p , &p 三个符号  p是一个指针变量的名字,表示此指针变量指向的内存地址,如果使用%p来输出的话,它将是一个16进制数. 而*p表示此指针指向的内存地址中存放的内 ...

  8. Codeforces 989D A Shade of Moonlight

    A Shade of Moonlight 列列式子发现, 对于同一个云来说只有反向的云才能和它相交, 然后我们发现这个东西有单调性,然后二分就好啦. #include<bits/stdc++.h ...

  9. Codeforces 442D Adam and Tree dp (看题解)

    Adam and Tree 感觉非常巧妙的一题.. 如果对于一个已经建立完成的树, 那么我们可以用dp[ i ]表示染完 i 这棵子树, 并给从fa[ i ] -> i的条边也染色的最少颜色数. ...

  10. 将xml 写到内存中再已string类型读出来

    System.IO.MemoryStream ms = new System.IO.MemoryStream(); xmlDoc.Save(ms); System.IO.StreamReader sr ...