我们何时应该修改通过引用传递的对象?

时间:2013-02-28 10:13:06

标签: java pass-by-reference

在查看一些java代码时,我遇到了一段代码:

Integer initialQ = someObject.getInitialQ();
Integer finalQ = null;
BigDecimal factor = calculateFactor(initialQ, finalQ);

if (finalQ.compareTo(initialQ) != 0){
   //do something
}

finalQ在方法calculateFactor中被修改。

Eclipse在if (finalQ...)上给了我一个“空指针访问:变量idUnidadFinal在此位置只能为空”警告。我理解,因为我们需要从方法返回factor,所以修改finalQ的唯一方法是将其作为参考传递。但是,这是正确的,可接受的做法吗?

我能想到的唯一选择是设计一个新的类,其中finalQfactor为字段,但看起来不必要复杂。

2 个答案:

答案 0 :(得分:4)

这不是通过引用传递的。在传递给它的函数中创建了一个新对象。 finalQ的值只能为null。如果要更改值或使finalQ全局化,则需要返回该对象。

答案 1 :(得分:2)

在java中没有名为通过引用传递的东西,这是一个令人困惑的术语。

将对象传递给另一个函数时,传递的是引用值。在该方法中,创建了本地引用副本并指向相同的内存地址。因此,通常如果传递非null变量并在单独的方法中修改它,原始对象也会更改,因为原始对象和方法本地副本指向相同的内存地址,但是如果您将新实例分配给方法本地副本然后后续更改到本地副本与原始副本无关。

在你的情况下,我猜你在 calculateFactor 中为 finalQ 分配了一个非空实例,这使得本地版本的finalQ 点到另一个内存地址并保留原始finalQ

因此,如果要修改传递给方法的对象,则只能自行更改,但不能为其分配另一个引用。如果最初传入的对象为null并且您希望对原始对象进行更改,则必须返回更改的对象。