Java不可变对象

来源:互联网 发布:大乐网络代理什么游戏 编辑:程序博客网 时间:2024/05/20 04:28

一、不可变类简介

不可变类:所谓的不可变类是指这个类的实例一旦创建完成后,就不能改变其成员变量值。如JDK内部自带的很多不可变类:Interger、Long和String等。

可变类:相对于不可变类,可变类创建实例后可以改变其成员变量值,开发中创建的大部分类都属于可变类。

下面的理解可能会易懂一些:

概念:不可变类的意思是创建该类的实例后,该实例的属性是不可改变的。Java中的8个包装类和String类都是不可变类。所以不可变类并不是指该类是被final修饰的,而是指该类的属性是被final修饰的。

自定义不可变类遵守如下原则:

1、使用private和final修饰符来修饰该类的属性。

2、提供带参数的构造器,用于根据传入的参数来初始化属性。

3、仅为该类属性提供getter方法,不要提供setter方法。

4、如果有必要,重写hashCode和equals方法,同时应保证两个用equals方法判断为相等的对象,其hashCode也应相等。

二、不可变类的优点 
说完可变类和不可变类的区别,我们需要进一步了解为什么要有不可变类?这样的特性对Java来说带来怎样的好处?

1.线程安全不可变对象是线程安全的,在线程之间可以相互共享,不需要利用特殊机制来保证同步问题,因为对象的值无法改变。可以降低并发错误的可能性,因为不需要用一些锁机制等保证内存一致性问题也减少了同步开销。2.易于构造、使用和测试
  • 1
  • 2
  • 3
  • 4

三、不可变类的设计方法

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

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

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

原创粉丝点击