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.
我有一个场景,我想设置一个 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.