Java并发编程——不可变对象

本文探讨了不可变对象在Java并发编程中的重要性,详细阐述了不可变对象需要满足的条件,包括对象的final属性、正确创建等。文章通过具体策略解释如何实现不可变对象,如使用final关键字,以及通过Collections.unmodifiable*()方法创建不可变集合。同时,文中还以Collections.unmodifiableMap()为例,解析其实现原理,指出此类对象防止修改的机制。
摘要由CSDN通过智能技术生成

一、不可变对象

1. 不可变对象需要满足的条件:

  • 对象创建以后其状态就不能修改;
  • 对象所有的域都是final类型;
  • 对象是正确创建的(在创建期间,this引用没有逸出)

2.具体来说可以通过以下策略来实现:

  • 将类声明成final,那么该类就无法被继承了;
  • 将所有的成员设置成private属性,使外界不能直接访问成员变量;
  • 设置成员变量不提供setter()方法,并将成员变量声明成final属性,使成员变量只能被赋值一次;
  • 通过构造器初始化所有成员,进行深度拷贝;
  • 在成员变量的getter()方法中,不直接返回变量本身,而是克隆对象,并返回对象得到拷贝;

不可变对象的实现可以参考String对象的实现;


二. final实现不可变对象

1. final的使用

final关键字主要用于修饰类、方法、变量:

  • 修饰类:该类则无法被继承;
  • 修饰方法:锁定方法不能被继承类修改;提高使用效率
  • 修饰变量:
    如果是修饰基本数据类型变量,那么一旦初始化后,该变量就不能被修改了;
    如果是修饰引用类型变量,那么一旦初始化后,该变量就不能被指向另外的对象,但是依然可以修改该对象内部的值
    如代码所示:
@Slf4j
public class ImmutableExample1 {
   

    private final static Integer a=1;
    private final static String b="2";
    //线程不安全的map
    private final static Map<Integer,Integer> map = Maps.newHashMap();

    static {
   
        map.put(1,2);
        map.put(3,4);
        map.put(5,6);
    }

    public static void main(String[] args) {
   
//        a=2;  //编译报错
//        b=3;  //编译报错
        map.put(1,</
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值