java 布尔值在被调用的方法中没有改变

java Boolean value not changing in called method

我有一个场景,我想设置一个 Boolean 对象,然后稍后在方法的构造函数中使用它的 booleanValue()。但是,设置对象的范围不同。它设置在由对象首次实例化的方法调用的方法中。根据我对Java如何传递原始参数和对象参数的理解以及在网上阅读了几篇帖子(例如this),当一个对象被传递到一个方法中时,它的属性是通过引用传递的,并且任何改变被调用方法执行完毕后,应在调用方法中体现被调用方法。但是我注意到当被调用的方法完成时,其中的任何更改都不会在调用方法中生效。

这是我的场景的快照:

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。

我不愿意将调用方法的 return 类型更改为 boolean,因为这需要更改可能调用此方法的其他代码位。目前他们只需要更改签名,但 return 类型更改需要更多工作,因为需要维护逻辑(即填充列表,然后用它做一些事情)

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

要实现您想实现的目标,您可以将 b 转换为一个字段,或者创建一个 MutableBoolean class 允许您执行类似 b.setValue(false).

首先,在 Java 中有很多关于参数传递的错误信息,例如 "objects are passed by reference, primitives are passed by value" 不正确 一切按值 传递。

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

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

其次,Boolean(与其他包装器对象以及 String 一样)是不可变对象。因此,对于不可变对象,由于它们是按值传递的(更好地说,它们的引用是按值传递的),你无法实现你想要的。你需要有一个可变对象,就像@rob 提到的那样。

或使用MutableBoolean from Apache Commons Lang.