java 布尔值在被调用的方法中未更改

2022-09-04 05:19:46

我有一个场景,我想设置一个对象,然后稍后在方法的构造函数中使用它。但是,设置对象的范围是不同的。它是在由首次实例化对象的方法调用的方法中设置的。基于我对Java如何传递基元和对象参数的理解,以及在线阅读几个帖子(例如),当一个对象被传递到一个方法中时,它的属性是通过引用传递的,并且在被调用的方法完成执行后,调用方法中的任何更改都应该反映在调用方法中。但是,我注意到,当调用的方法完成时,其中的任何更改在调用方法中都不会生效。BooleanbooleanValue()

以下是我的方案的快照:

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;
    }
    ...
    ...
}

当代码到达创建时,即使 if 语句 in 为 true,并且在该方法中将设置为 false,也是如此。CustomObjectb.booleanValue()callingMethod()Boolean

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


答案 1

首先,Java中有很多关于参数传递的错误信息,比如“对象通过引用传递,基元通过值传递”,这是不正确的一切都是通过价值传递的

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

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

其次,(像其他包装对象一样)是不可变的。因此,对于一个不可变的对象,并且当它们按值传递时(更好的说,它们的引用是按值传递的),你无法实现你想要的。您需要有一个可变对象,就像@rob提到的。BooleanString

或者使用 Apache Commons Lang 中的 MutableBoolean


答案 2

问题是您正在重新分配名为Method。在 calledMethod 中重新赋值只会重新赋值该方法的参数列表中声明的变量;它不会修改在调用方作用域中声明的变量。b

要实现您想要实现的目标,您可以转换为字段,也可以创建一个可变布尔类,该类允许您执行类似.bb.setValue(false)