注意:同樣的問題適用于其他不可變類型,如String和Boolean。我有這樣的方法(這是一個更復雜的方法的簡單例子):例1public BigDecimal addTwo(BigDecimal bigDecimal) {
bigDecimal = bigDecimal.add(new BigDecimal(2));
return bigDecimal;}我知道,我可以簡單地回來bigDecimal.add(new BigDecimal(2))。但這只是一個例子。這段代碼的問題是我無法添加final到方法參數和Eclipse困擾我。所以我會寫:例2public BigDecimal addTwo(final BigDecimal bigDecimal) {
BigDecimal bigDecimalLocal = bigDecimal;
bigDecimalLocal = bigDecimalLocal.add(new BigDecimal(2));
return bigDecimalLocal;}我知道,我可以直接做BigDecimal bigDecimalLocal = bigDecimal.add(new BigDecimal(2))。但我再說一遍,這只是一個例子。問題是:當我這樣做時:BigDecimal bigDecimalLocal = bigDecimal;我不是在創造一個新的BigDecimal。我將同一個對象分配給另一個變量。我在SO上發現了一種簡單的克隆BigDecimal方法:例3BigDecimal bigDecimalLocal = new BigDecimal(bigDecimal.toString());問題是:既然BigDecimal是不可改變的,這真的有必要嗎?我不能像示例#2那樣簡單嗎?我認為final關鍵字不能以這種方式失效。
3 回答

開心每一天1111
TA貢獻1836條經驗 獲得超13個贊
示例2很好,但您根本不需要局部變量,我認為它們會降低方法的可讀性。我會這么做的
public BigDecimal addTwo(final BigDecimal bigDecimal) { return bigDecimal.add(BigDecimal.valueOf(2));}
如果我想添加另一個BigDecimal怎么辦?“我必須返回
bigDecimal.add(BigDecimal.valueOf(2).add(BigDecimal.valueOf(3))
?我認為它不那么可讀。
如果要添加兩次(或多個常量),那么將常量提取為常量可能是有意義的。喜歡,
private static final BigDecimal TWO = BigDecimal.valueOf(2);private static final BigDecimal THREE = BigDecimal.valueOf(3); public static BigDecimal addTwoAndThree(final BigDecimal bigDecimal) { return TWO.add(THREE).add(bigDecimal);}

夢里花落0921
TA貢獻1772條經驗 獲得超6個贊
看來你不明白引用的概念。
當你有這個:
BigDecimal incoming = new BigDecimal(2);addTwo(incoming);... public BigDecimal addTwo(BigDecimal bigDecimal) { bigDecimal = bigDecimal.add(new BigDecimal(2));}
事情是:在該方法結束后incoming
仍然是2!
該add()
調用創建一個新的 BigDecimal對象,然后變量bigDecimal指向該新對象。
但參考incoming
仍指向舊對象!
簡而言之:方法參數的關鍵字final 不完全符合你的想法。其唯一目的是阻止您重新分配該參數/值。所以你真的想了解對象和引用之間的區別。然后關于通過引用傳遞。
添加回答
舉報
0/150
提交
取消