網頁

2019/5/10

Java 為什麼BigDecimal物件傳入方法修改後值沒改變?

昨天同事問我為什麼BigDecimal物件傳入方法中修改內容後值最沒被改變?用描述的有點不好理解,請見以下範例。

public class Main {

    public static void main(String[] args) {
        BigDecimal b1 = BigDecimal.ONE;
        
        increase(b1);

        System.out.println(b1); // 1
    }
    
    private static void increase(BigDecimal b) {
        b.add(new BigDecimal(9));
    }
    
}

你可能會覺得很納悶印出的結果應該是10才對,怎麼會是1呢?

那是因為Java的BigDecimalString,及其他如原始型別的包裹類別(Wrapper Class)如IntegerDouble等都是Immutable Class(不可變的),也就是一旦建構後,內容是無法被更改的。

所以b.add(new BigDecimal(9));並不會改變b本身的內容,而是將相加後的內容放入一個新的BigDecimal物件然後回傳,所以要改寫如下。

public class Main {

    public static void main(String[] args) {
        BigDecimal b1 = BigDecimal.ONE;
        
        b1 = increase(b1);

        System.out.println(b1); // 10
    }
    
    private static BigDecimal increase(BigDecimal b) {
        return b.add(new BigDecimal(9));
    }
    
}

參考:

沒有留言:

張貼留言