java布尔值在被调用方法中没有改变[重复]

Posted

技术标签:

【中文标题】java布尔值在被调用方法中没有改变[重复]【英文标题】:java Boolean value not changing in called method [duplicate] 【发布时间】:2016-08-07 13:36:10 【问题描述】:

我有一个场景,我想设置一个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 在该方法中设置为假。

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

【问题讨论】:

【参考方案1】:

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

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

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

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

或者使用Apache Commons Lang中的MutableBoolean

【讨论】:

那个链接真的很有见地。我鼓励任何看到此内容的 Java 程序员阅读它。【参考方案2】:

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

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

【讨论】:

为什么将b转换为字段可以使b在调用方法中改变被调用方法? 如果您将b 转换为字段(即,它不再是参数,而是对被调用方法可见),则调用方法和被调用方法都引用同一个变量;而如果b 是参数,则调用方法和被调用方法引用了两个不同的变量。

以上是关于java布尔值在被调用方法中没有改变[重复]的主要内容,如果未能解决你的问题,请参考以下文章

变量的值传递

同步与异步,阻塞与非阻塞

JAVA-回调实现小例子

Spring中同一个service中方法相互调用事务不生效问题解决方案

布尔值在活动中第一次返回 false [重复]

全局布尔值在 addListenerForSingleEventValue 函数内设置,但在以下 if 语句中无法识别 [重复]