猿问

是不是要定义final不可变参数,将参数绑定到另一个局部变量并改变局部变量?

注意:同样的问题适用于其他不可变类型,如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。我将同一个对象分配给另一个变量。我在SO发现了一种简单的克隆BigDecimal方法:

例3

BigDecimal bigDecimalLocal = new BigDecimal(bigDecimal.toString());

问题是:既然BigDecimal是不可改变的,这真的有必要吗?我不能像示例#2那样简单吗?我认为final关键字不能以这种方式失效。


函数式编程
浏览 591回答 3
3回答

开心每一天1111

示例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

看来你不明白引用的概念。当你有这个: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 不完全符合你的想法。其唯一目的是阻止您重新分配该参数/值。所以你真的想了解对象和引用之间的区别。然后关于通过引用传递。
随时随地看视频慕课网APP

相关分类

Java
我要回答