一、不可变类

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

Java不可变类作为参数传递遇到的坑相关推荐

  1. Java 不可变类的整洁之道

    本文讲的是Java 不可变类的整洁之道, 当一个普通类 (class) 的实例不能被修改时,我们便称之为「不可变类」(immutable class).这样的类在实例化时便需要提供其所有的值,而在之后 ...

  2. JAVA的可变类与不可变类

    可变类和不可变类(Mutable and Immutable Objects) 1. 可变类和不可变类(Mutable and Immutable Objects)的初步定义: 可变类:当你获得这个类 ...

  3. java 构建者模式_Java不可变类–构建器模式

    java 构建者模式 In my last post, I explained about Builder Pattern in Java. Sometime back I wrote an arti ...

  4. java 不可变性_JAVA不可变类(immutable)机制与String的不可变性(推荐)

    一.不可变类简介 不可变类:所谓的不可变类是指这个类的实例一旦创建完成后,就不能改变其成员变量值.如JDK内部自带的很多不可变类:Interger.Long和String等. 可变类:相对于不可变类, ...

  5. Java 不可变对象整洁之道

    作译者简介:<Android高级进阶>作者,微信公众号asce1885,专注与原创或者分享 Android,iOS,React Native,Web 前端移动开发领域高质量文章,主要包括业 ...

  6. java string改变的影响_为什么Java的string类要设成immutable(不可变的)

    最流行的Java面试题之一就是:什么是不可变对象(immutable object),不可变对象有什么好处,在什么情况下应该用,或者更具体一些,Java的String类为什么要设成immutable类 ...

  7. java常见不可变类_Java语言不可变类的诀窍

    示例 不可变对象是状态无法更改的对象.不可变类是其实例根据设计和实现是不可变的类.作为不可变性示例最常见的Java类是java.lang.String. 以下是陈规定型的示例: public fina ...

  8. java算法在工作,我在北京找工作(三):java实现算法2 直接插入排序+不可变类...

    2013年9月3日 貌似看的排序算法实现的有点没难度,但还是一步一步稳扎稳打的来. 1.直接插入排序 直接插入排序(Insertion Sort)的基本思想:将数组分为有序区和无序区,每次将一个无序区 ...

  9. setyear java_如何在Java中创建不可变类

    如果对象在构造后无法更改,则该对象是不可变的.不可变对象不会以任何方式暴露其他对象来修改其状态; 对象的字段仅在构造函数内初始化一次,并且永远不会再次更改. 在本文中,我们将定义在Java中创建不可变 ...

最新文章

  1. 交情来自一系列的交易
  2. POJ3345 Bribing FIPA 【背包类树形dp】
  3. 学python可以做什么副业-写代码做副业月入10K的方法都藏在这几个公众号里!
  4. SAP云平台上Redis dashboard提供的功能一览
  5. Codeforces 864E Fire(背包DP)
  6. 关于头文件中的 static inline函数
  7. struts2.0标签库
  8. 程序员8月薪资新鲜出炉,圈外人却在酸?
  9. 集合类接口和类层次关系图
  10. 2022创业基础——李家华等章节测试答案以及期末考试答案
  11. 五笔字根表识别码图_五笔字根识别码学习
  12. QQ音乐与网易云音乐评测分析
  13. php技术聊天室源码,PHP聊天室_WebSocket技术实战
  14. 哈夫曼树的构造和哈夫曼编码实现详细讲解(含例题详细讲解)
  15. xlsxwriter写入Excel
  16. 小马哥-----高仿苹果6 plus刷机拆机多图展示 拆机主板图与开机界面图 6572芯片 v76机型
  17. TikTok怎么运营带货
  18. 使用C++模拟动态密码验证
  19. 【栈和队列】栈的push、pop序列
  20. 淘宝中影响产品SEO权重的因素有哪些?

热门文章

  1. mybatis与mysql调优_MySQL + mybatis的SQL优化方案
  2. 台式计算机机箱的作用,如何选择台式电脑机箱?小白安装电脑机箱常识指南
  3. python3精要(61)-线性回归
  4. 【CV】OpenCV 入门之旅
  5. 【机器学习】KNN算法代码练习
  6. 小孩都看得懂的YOLO!
  7. 【Python】如何用Python来操作PDF文件,建议收藏
  8. 【机器学习基础】一文归纳AI调参炼丹之法
  9. 【机器学习基础】数学推导+纯Python实现机器学习算法28:CRF条件随机场
  10. 【效率】神器工具:新一代多系统启动 U 盘装机解决方案