`
flyfoxs
  • 浏览: 295004 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

如何在JAVA中创建一个不可变对象

JVM 
阅读更多

1. 对象的状态在构造函数之后都不能被修改,任何修改应该通过创建一个新对象来实现.

2. 所有的对象属性应该都设置为final

3. 对象创建要正确,例如:对象的应用不能在构造函数中被泄露出去

4. 对象要设置为final,确保不要继承的Class修改了immutability特性

 

上面这些规则不是100%的不能打破,比如String对象hash属性就不是一个final对象,但是Sting依旧是一个immutability 的对象.因为它有其它机制来保证,只要Sting的内容不变,hash值就不会变.

 

参考:http://javarevisited.blogspot.com/2013/03/how-to-create-immutable-class-object-java-example-tutorial.html

0
0
分享到:
评论

相关推荐

    换个角度理解Java中的不可变集合.docx

    创建对象的不可变拷贝是一项很好的防御性编程技巧。Guava为所有JDK标准集合类型和Guava新集合类型都提供了简单易用的不可变版本。 JDK也提供了Collections.unmodifiableXXX方法把集合包装为不可变形式,但我们认为...

    Java如何创建不可变类

     其实,如果一个类被设计成不可变的类,那么这个类的实例化对象也是不可变的。  不可变类:当你获得这个类的一个实例引用时,你不可以改变这个实例的内容。  那么,什么是不可变对象?  一旦一个类的实例化...

    为什么Java字符串是不可变对象?

     流行的Java面试题之一是:什么是不可变对象(immutable object),不可变对象有什么好处,在什么情况下应该用,或者更具体一些,Java的String类为什么要设成immutable类型?  不可变对象,顾名思义是创建后不可以...

    Java并发编程规则:不可变对象永远是线程安全的.docx

    创建后状态不能被修改的对象叫作不可变对象。不可变对象天生就是线程安全的。它们的常量(变量)是在构造函数中创建的,既然它们的状态无法被修改,那么这些常量永远不会被改变——不可变对象永远是线程安全的。

    实验05 Java集合.doc

    1)创建一个可放置Person类对象的HashSet; 2)依次添加上述5个对象到HashSet中; 3)把集合中的元素打印出来(使用迭代器Iterator) 2、编写程序练习List集合的基本使用: 1) 创建一个只能容纳String对象名为names...

    Java不可变对象整洁之道

    在 Java 语言中,不可变类指的是这个类的实例是不可修改的,在创建类实例时我们需要指定这个类所有的属性值,而且在以后的生命周期中这些属性值都不能重新赋值。经验丰富的你可能已经知道 Java 中已经存在一些不可变...

    java 面对对象编程.pdf.zip

    String 为什么是不可变的? 字符串拼接用“+” 还是 StringBuilder? String#equals() 和 Object#equals() 有何区别? 字符串常量池的作用了解吗? String s1 = new String("abc");这句话创建了几个

    JAVA_API1.6文档(中文)

    java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...

    Java虚拟机中对象探秘--对象头创建、对象头、对象锁、synchoronized底层实现.docx

    2)空闲列表(Free List),Java堆中内存并不规整(已使用的内存和空闲的内存相互交错),虚拟机通过维护一个记录哪些内存可用的列表,在分配时从列表中找到一块中够大的空间划分给对象实例,并更新列表上的记录。

    JAVA面向对象详细资料

    30.2 引用类型加final修饰表示引用不可变 44 31 static关键字 44 31.1 static关键字可以修饰4个地方 44 31.2 静态属性 44 31.3 静态的与实例的 45 31.4 静态代码块 45 31.5 静态方法 45 31.6 静态方法是不能被继承 ...

    java源码包---java 源码 大量 实例

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    Java String 类.pdf

    它是不可变的,一旦创建了一个字符串对象,就无法修改它。 二、String类和StringBuilder类有什么区别? String类和StringBuilder类的最主要区别在于可变性。String类是不可变的,一旦创建了一个字符串对象,就无法...

    java源码包2

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    Java实验的答案源程序

    提示:创建一个java.util.Date类的对象代表当前的系统日期,使用对象的getYear()方法、getMonth()方法、 getDay()方法可获得对应的年月日。编写一个三角形类,能根据3个实数构造三角形对象,如果三个实数不满足 ...

    JAVA上百实例源码以及开源项目

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    java源码包4

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    java源码包3

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    [java]读书笔记整理:一切都是对象

    所以,在C和C++里将一个较大作用域的变量“隐藏”起来的做法,在java里是不允许的。因为java设计者认为这样做会导致程序混乱。 对象的作用域 Java对象不具备和基本类型一样的生命周期。当用new创建一个java...

    Java中的String为什么是不可变的?

    可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象是不可变的。不能改变状态的意思是,不能改变对象内的成员变量,包括基本数据类型的值不能改变,引用类型的变量不能指向其他的...

Global site tag (gtag.js) - Google Analytics