日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

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

發布時間:2025/1/21 java 81 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 類的方法的時候,要有一個對象接受返回值。

總結

以上是生活随笔為你收集整理的Java不可变类作为参数传递遇到的坑的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。