Java的Final和不可变

Final关键字

final关键字大概有如下几种用法。不再赘述。

  • 修饰字段
  • 修饰类(禁止继承)
  • 修饰方法(禁止子类覆盖,注意现在已经不需要因为效率把方法设置为final了)
  • 修饰方法参数

final修饰在静态字段上时,一定需要在类加载时初始化完成之前初始化该值。

    final static private int c;
    static {
        c = 2;
    }    

final修饰在实例字段上时,一定需要在对象执行完构造函数之前初始化该值


    final private int c;
    testMulti(int param){
        this.c = param;
    }

Immutable object

使用Immutable object,可以避免线程同步,不用写clone,是对象中的最好用的对象。不过,当然会有性能问题啊。
一个不可变对象显然要有下面的特点
+ 不提供setter
+ 设置类为final,使其不被子类化。
+ 设置所有成员变量(域)为final,防止直接修改。这条包含private,因为private也可以通过反射被访问到。
+ 如果成员变量是对象,则成员变量也应该是Immutable object。如果不考虑反射,这条可以忽略,但是对外提供的getter要进行保护性拷贝。

可以参考,这是String不可变对象的实现。
https://blog.csdn.net/define_us/article/details/52311030

不可变对象中的保护性拷贝

我们希望不可变对象在初始化之后就不可改变,但是,初始化阶段同样是可以做猫腻的。不可变对象在用外部对象初始化内部数据结构时,应该进行保护性拷贝。保护性拷贝应该发生在参数检查之前。不然,外部调用可以先传入合法参数通过参数检查,然后利用多线程更改参数对象,从而可能绕过参数检查。

猜你喜欢

转载自blog.csdn.net/define_us/article/details/80175172