欢迎访问 生活随笔!

凯发k8官方网

当前位置: 凯发k8官方网 > 编程语言 > java >内容正文

java

java不可变类作为参数传递遇到的坑 -凯发k8官方网

发布时间:2025/1/21 java 23 豆豆
凯发k8官方网 收集整理的这篇文章主要介绍了 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 类的方法的时候,要有一个对象接受返回值。

总结

以上是凯发k8官方网为你收集整理的java不可变类作为参数传递遇到的坑的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得凯发k8官方网网站内容还不错,欢迎将凯发k8官方网推荐给好友。

  • 上一篇:
  • 下一篇:
网站地图