Java不可变类作为参数传递遇到的坑

一、不可变类

不可变类在对象的整个生命周期(lifetime)内保持不变。Java平台类库中包含许多不可变的类,其中有String、基本类型的包装类、BigInteger、BigDecimal。

存在不可变的类有许多理由:不可变的类比可变的类更加容易设计,实现和使用。它们不容易出错,而且更加安全。

不可变类有以下特点:

  • 类中所有的成员变量被final修饰
  • 类中没有修改成员变量的方法,例如setXXX,可以提供一个带参的构造函数来初始化这些成员变量
  • 确保类中的方法不会被重写.可以将类或者类中的方法定义为final的来实现
  • 使所有的域都成为私有的private 。

不可变对象本质上是线程安全的,它们不要求同步。当多个线程并发访问这样的对象时,它们不会遭到破坏,所以,不可变对象可以被自由的共享。

不可变类的真正唯一的缺点是,对于每个不同的值都需要一个单独的对象。创建这种对象的代价可能很高,特别是对于大型对象的情形。所以,最好的办法是提供一个公有的可变配套类。

例如使用JDK9中的List.of创建出的list是不可变的,不能使用list.add方法,否则会报错。

二、使用BigDecimal作为参数传递

举个简单例子当时我的使用场景,将BigDecimal作为参数传递给方法,结果方法执行完之后值没变。

    public static void main(String[] args) {
        BigDecimal bigDecimal = new BigDecimal("200");
        add1(bigDecimal);
        System.out.println(bigDecimal);
    }

    public static void add1(BigDecimal bigDecimal) {
        bigDecimal.add(new BigDecimal("200"));
    }

点开add方法发现源码return只是返回了计算结果,而没有把计算结果赋值给调用者!
这就好比 t.add(y) ,只是执行了 t+y 而没有把计算结果返回给 t。

因为BigDecimal是不可变类,所以我们在使用BigDecimal 类的方法的时候,要有一个对象接受返回值。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

境里婆娑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值