为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

函数式编程 2019-04-18 14:11:09
注意:同样的问题适用于其他不可变类型,如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);}


查看完整回答
反对 回复 2019-05-15
?
梦里花落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 不完全符合你的想法。其唯一目的是阻止您重新分配该参数/值。所以你真的想了解对象和引用之间的区别。然后关于通过引用传递


查看完整回答
反对 回复 2019-05-15
  • 3 回答
  • 0 关注
  • 590 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信