昨天同事問我為什麼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的BigDecimal
,String
,及其他如原始型別的包裹類別(Wrapper Class)如Integer
,Double
等都是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));
}
}
參考:
沒有留言:
張貼留言