一、不可变类
不可变类在对象的整个生命周期(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 类的方法的时候,要有一个对象接受返回值。