注意:同样的问题适用于其他不可变类型,如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
提交
取消