那么什么是immutable objects?什么又是mutable Objects呢?

immutable Objects就是那些一旦被创建,它们的状态就不能被改变的Objects,每次对他们的改变都是产生了新的immutable的对象,而mutable Objects就是那些创建后,状态可以被改变的Objects.


举个例子:

String和StringBuilderString是immutable的,每次对于String对象的修改都将产生一个新的String对象,而原来的对象保持不变,而StringBuilder是mutable,因为每次对于它的对象的修改都作用于该对象本身,并没有产生新的对象。

但有的时候String的immutable特性也会引起安全问题,这就是密码应该存放在字符数组中而不是String中的原因!


使用Immutable对象的好处?

1)Immutable对象是线程安全的,可以不用被synchronize就在并发环境中共享
2)Immutable对象简化了程序开发,因为它无需使用额外的锁机制就可以在线程间共享
3)Immutable对象提高了程序的性能,因为它减少了synchroinzed的使用

总的来说,本身就是线程安全的,避免了synchronized的使用。


如何在Java中写出Immutable的类?

要写出这样的类,需要遵循以下几个原则:

1)immutable对象的状态在创建之后就不能发生改变,任何对它的改变都应该产生一个新的对象。(克隆)

2)Immutable类的所有的属性都应该是final的。(属性初始化后不能被修改)

3)对象必须被正确的创建,比如:对象引用在对象创建过程中不能泄露(leak)。

4)对象应该是final的,以此来限制子类继承父类,以避免子类改变了父类的immutable特性。

5)如果类中包含mutable类对象,那么返回给客户端的时候,返回该对象的一个拷贝,而不是该对象本身(该条可以归为第一条中的一个特例)


如何创建Immutable对象?

多线程:Immutable对象?如何创建Immutable对象?相关推荐

  1. 浅析Java中对象的创建与对象的数据类型转换

    这篇文章主要介绍了Java中对象的创建与对象的数据类型转换,是Java入门学习中的基础知识,需要的朋友可以参考下 Java:对象创建和初始化过程 1.Java中的数据类型     Java中有3个数据 ...

  2. java对象的访问定位_2、JVM-Java对象的创建、对象结构、对象访问定位-Go语言中文社区...

    目录 记录下来方便个人学习复习 注:根据new的参数在常量池中定位一个类的符号引用 --这句话的意思是:常量池相当于c语言中的指针地址集合,所以就是在常量池中保存new对象的地址,通过地址定位对象在堆 ...

  3. 使用工厂模式创建收件地址ReceiveAddress 订单对象,创建 若干对象 (属性自定义)

    设计Account账户类Account账户类有以下属性 accNo //账户账号 accName //账户姓名 accPassword //账户密码 accTelno //账户手机号 accBalan ...

  4. sqlserver2008未将对象引用设置到对象的实例_JVM | Java对象的创建、存储和访问详解...

    引言   Java程序员都知道如何创建对象,不就是一个Person person = new Person()的语句就解决了么?然而,我们只知道new,却对于底层如何实现对象的创建.如何存储到内存中去 ...

  5. 【Kotlin】Kotlin 构造函数 ( 主构造函数 | 主构造函数声明属性 | init 初始化代码块 | 次构造函数 | 构造函数委托 | 调用构造函数创建实例对象 )

    文章目录 I . 主构造函数 II . 主构造函数声明属性 III . init 初始化代码块 IV . 主构造函数参数 和 成员变量访问方式 V . 主构造函数 可见性 设置 VI . 次构造函数 ...

  6. html如何创建学生信息表,创建学生对象并且能访问网页

    讲解对象:创建学生对象并且能访问网页 作者:融水公子rsgz 1 templates下面新建两个网页 grades.html 内容: charset="UTF-8"> 班级信 ...

  7. 在 Java 中,为什么需要创建内部类对象之前需要先创建外部类对象

    在 Java 中,为什么需要创建内部类对象之前需要先创建外部类对象   我们知道,在 Java 中,创建一个内部类对象之前,需要它的一个外部类对象.这是因为内部类可能使用外部类的数据.   在内部类中 ...

  8. Ajax入门(创建 XMLHttpRequest 对象)

    XMLHttpRequest 是 AJAX 的基础. 所有现代浏览器均支持 XMLHttpRequest 对象(IE5 和 IE6 使用 ActiveXObject). XMLHttpRequest ...

  9. c++类对象的创建方式

    对象创建限制在堆或栈 c++类对象的创建方式 对象创建限制在堆或栈 C++ 中的类的对象的建立模式 如何将类限制在堆上呢? C++ 中的类的对象的建立模式 C++ 中的类的对象的建立模式分为两张:静态 ...

  10. python类的定义和创建_Python类对象的创建和使用

    通过前面章节的学习,我们已经学会如何定义一个类,但要想使用它,必须创建该类的对象. 创建类对象的过程,又称为类的实例化. 类名(参数) 定义类时,如果没有手动添加 __init__() 构造方法,又或 ...

最新文章

  1. IT兄弟连 JavaWeb教程 JSON和JSON字符串
  2. Android activity-alias 的使用
  3. HDU4372(第一类斯特林数)
  4. IDEA如何像Eclipse打开多个项目?
  5. GStreamer1.0中no element “ffmpegcolorspace”报错解决(八)
  6. allegro怎么导出PCB文件里封装
  7. promise执行顺序总结
  8. 办公技巧分享:如何把PDF转换成Word的5种方法
  9. DNS主域名服务器、从域名服务器和缓存域名服务器的构建和原理
  10. 温湿度传感器—HDC1080
  11. 【Web】HTML(No.06)表格标签经典案例《小说排行榜》
  12. 空指针带来的AV异常.
  13. 软件工程专业四年注意事项以及学习计划
  14. 11部中考常考的名著思维导图汇总
  15. 协方差,协方差矩阵,矩阵特征值
  16. 【考研复试】计算机相关专业面试英语自我介绍范文(一)
  17. 使用Makefile链接so库文件
  18. 前端白屏出现的原因及一些解决方式
  19. 明翰经验系列之恋爱篇V5.6(持续更新)
  20. 微信小程序导航栏或菜单栏吸顶效果简单实现

热门文章

  1. GridView 用 checkbox 全选并取值
  2. /sbin/ifup: configuration for eth0 not found解决
  3. Python 封装MySQL类
  4. cglib中Enhancer的简单使用
  5. FTP匿名用户的配置
  6. gcc/g++命令参数笔记
  7. Flask实战2问答平台-登录限制(装饰器)
  8. 微信小程序开发-入门基础
  9. 数据类型_分享redis中除5种基础数据类型以外的高级数据类型
  10. java基础(一):谈谈java内存管理与垃圾回收机制