美文网首页
不可变对象

不可变对象

作者: mrjunwang | 来源:发表于2018-08-22 08:16 被阅读0次

https://www.cnblogs.com/jaylon/p/5721571.html

  1. 类添加final修饰符,保证类不被继承。
    如果类可以被继承会破坏类的不可变性机制,只要继承类覆盖父类的方法并且继承类可以改变成员变量值,那么一旦子类以父类的形式出现时,不能保证当前类是否可变。

  2. 保证所有成员变量必须私有,并且加上final修饰
    通过这种方式保证成员变量不可改变。但只做到这一步还不够,因为如果是对象成员变量有可能再外部改变其值。所以第4点弥补这个不足。

  3. 不提供改变成员变量的方法,包括setter
    避免通过其他接口改变成员变量的值,破坏不可变特性。

4.通过构造器初始化所有成员,进行深拷贝(deep copy)

如果构造器传入的对象直接赋值给成员变量,还是可以通过对传入对象的修改进而导致改变内部变量的值。
String对象的不可变性的优缺点
从上一节分析,String数据不可变类,那设置这样的特性有什么好处呢?我总结为以下几点:

1.字符串常量池的需要.
字符串常量池可以将一些字符常量放在常量池中重复使用,避免每次都重新创建相同的对象、节省存储空间。但如果字符串是可变的,此时相同内容的String还指向常量池的同一个内存空间,当某个变量改变了该内存的值时,其他遍历的值也会发生改变。所以不符合常量池设计的初衷。

  1. 线程安全考虑。
    同一个字符串实例可以被多个线程共享。这样便不用因为线程安全问题而使用同步。字符串自己便是线程安全的。

  2. 类加载器要用到字符串,不可变性提供了安全性,以便正确的类被加载。譬如你想加载java.sql.Connection类,而这个值被改成了myhacked.Connection,那么会对你的数据库造成不可知的破坏。

  3. 支持hash映射和缓存。
    因为字符串是不可变的,所以在它创建的时候hashcode就被缓存了,不需要重新计算。这就使得字符串很适合作为Map中的键,字符串的处理速度要快过其它的键对象。这就是HashMap中的键往往都使用字符串

相关文章

  • 可变对象使用copy修饰、不可变对象使用strong会发生什么

    使用copy修饰不可变对象的目的,是防止把可变类型的对象赋值给不可变类型的对象时,可变类型对象的值发生变化,引起不...

  • OC基础-copy & mutableCopy

    按方法区分 copy:产生不可变对象 mutableCopy:产生可变对象 按拷贝深度区分 浅拷贝:不产生新对象,...

  • python中可变对象和不可变对象

    Python在heap中分配的对象分成两类:可变对象和不可变对象。 所谓可变对象是指,对象的内容可变,而不可变对象...

  • python可变和不可变对象

    python中有可变对象和不可变对象,可变对象:list,dict.不可变对象有:int,string,float...

  • Python浅拷贝 深拷贝

    内存泄漏太可怕。 Python 可变对象 & 不可变对象 在Python中,对象分为两种:可变对象和不可变对象。 ...

  • python可变对象和不可变对象

    Python在heap中分配的对象分为两类:可变对象和不可变对象。 可变对象:list,dict 不可变对象:in...

  • Python中的可变对象和不可变对象

    Python中的可变对象和不可变对象 什么是可变/不可变对象 不可变对象,该对象所指向的内存中的值不能被改变。当改...

  • Guava 集合类

    不可变集合类 为什么要使用不可变集合不可变对象有很多优点,包括: 当对象被不可信的库调用时,不可变形式是安全的;不...

  • 关于 String

    1. String 不可变 不可变对象对象在创建完成之后,其状态不能再被改变,则该对象即为不可变对象 对象不可变具...

  • 可变类型、不可变类型

    赋值或传递参数的时候,是原对象的引用,可分为可变对象、不可变对象,可变对象的内容是可变的,例如list。而不可变的...

网友评论

      本文标题:不可变对象

      本文链接:https://www.haomeiwen.com/subject/lnsdiftx.html