- 已关闭**。此问题为opinion-based。当前不接受答案。
- 想要改进此问题吗?**请更新此问题,以便editing this post可以用事实和引文来回答。
8小时前关门了。
Improve this question
注意:同样的问题也适用于其他不可变类型,比如String和Boolean。
我有一个类似这样的方法(这是一个更复杂方法的简单示例):
示例1
public BigDecimal addTwo(BigDecimal bigDecimal) {
bigDecimal = bigDecimal.add(new BigDecimal(2));
return bigDecimal;
}
我知道,我可以简单地返回bigDecimal.add(new BigDecimal(2))
,但这只是一个例子。
这段代码的问题是我不能将final
添加到方法参数中,Eclipse让我很困扰。
示例2
public 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
。我是将相同的对象赋给不同的变量。我知道克隆BigDecimal
的一个简单方法是:
示例3
BigDecimal bigDecimalLocal = new BigDecimal(bigDecimal.toString());
问题是:既然BigDecimal
是不可变的,这真的有必要吗?我不能简单地像示例2那样做吗?我认为final
关键字不能以这种方式无效。
3条答案
按热度按时间toe950271#
例2很好,但是你根本不需要局部变量,而且我认为它们会降低方法的可读性。
如果我想添加另一个BigDecimal”怎么办?我必须返回
bigDecimal.add(BigDecimal.valueOf(2).add(BigDecimal.valueOf(3))
?我认为它不是那么可读。如果你要多次添加两个(或者多个常量),那么把常量提取为常量可能是有意义的。
d4so4syb2#
看来你不明白推荐人的概念。
当你有这个:
问题是:
incoming
在该方法结束后仍然是2!add()
调用创建了一个newBigDecimal对象,变量bigDecimal随后指向这个新对象。但是引用
incoming
仍然指向旧对象!长话短说:方法参数的关键字final,完全不是,你所想的,它唯一的目的是防止你重新赋值给那个参数,所以你真的想了解objects and references,和pass by reference之间的区别。
wsewodh23#
好吧,我承认我对
final
关键字一无所知:final
,对象都保持不变final
,该对象也会在方法外部更改。final
的参数唯一能做的就是不能只在方法中重新分配。我得说我经常做这样的事:
或
或
或
恕我直言,我写上面的方法可读性更强,对不起
final
。