2016-04-15 703 views
6

我有一个场景,我想设置一个Boolean对象,然后在方法的后面的构造函数中使用它的booleanValue()。但是,对象的设置范围不同。它被设置在一个方法中,该方法首先实例化对象。基于我对Java如何传递基元和对象参数以及在线阅读多篇文章(如this)的理解,当一个对象被传入一个方法时,其属性通过引用传递,并且被调用方法的任何改变都应该反映在调用方法执行完成后调用方法。但是我注意到,当被调用方法完成时,那里的任何更改都不会在调用方法中生效。java布尔值在被调用的方法中没有改变

这里是我的方案的快照:

private CustomObject1 callingMethod(){ 
    Boolean b = Boolean.TRUE; 
    List<CustomObject2> list = this.calledMethod(b); 
    //Create CustomObject1 with b.booleanValue() as one of the arguments in the constructor 
} 

private List<CustomObject2> calledMethod(Boolean b){ 
    ... 
    ... 
    if(condition){ 
     b = Boolean.FALSE; 
    } 
    ... 
    ... 
} 

通过代码达到CustomObject创作b.booleanValue()始终是真实的时候,即使在callingMethod() if语句是真实的Boolean设置为false在那个方法。

我不愿意将调用方法的返回类型更改为boolean,因为它需要更改可能调用此方法的其他代码位。目前他们只需要签名更改,但返回类型的变化需要更多的工作,因为需要维护逻辑(即填充列表,然后使用它进行操作)

回答

14

首先,Java中有很多关于参数传递的错误信息,比如“对象通过引用传递,原语通过值传递”,这是不是真的全部通过价值通过

您没有在Java中通过引用传递对象,而是按值传递对象引用。 Boolean b不包含Boolean对象,它保存对Boolean对象的引用(指针)。

这里有一个关于它的好文章:http://javadude.com/articles/passbyvalue.htm

其次,Boolean(像其他包装对象,也String)是不可变对象。因此,对于一个不可变的对象,并且当它们被值传递(更好地说,它们的引用是通过值传递的),你无法实现你想要的东西。你需要有一个可变的对象,就像@rob提到的那样。

或从Apache Commons Lang使用MutableBoolean

+1

该链接非常有见地。我鼓励任何看到这个的Java程序员阅读它。 –

2

问题是您正在为calledMethod重新分配b。 calledMethod中的重新分配仅重新分配在该方法的参数列表中声明的变量;它不会修改在调用者范围内声明的变量。

要做你想达到的目标,你可以将b转换为一个字段,或者创建一个MutableBoolean类,它允许你做类似b.setValue(false)的事情。

+0

为什么将b转换为字段可以使b在调用方法中改变调用方法? – user1169587

+1

如果将'b'转换为一个字段(即,它不再是一个参数,但对被调用方法可见),调用方法和被调用方法都引用相同的变量;而如果'b'是一个参数,则调用方法和调用方法引用2个不同的变量。 – rob