如何在方法中更改布尔值的值?

时间:2012-12-23 15:09:09

标签: java variables

这可能太傻了。 我在main方法中有一个布尔变量。通过调用此类或另一个类的另一个方法,我希望在main方法中修改我的布尔值。我这样做但改变只发生在被调用的方法(本地),而不是调用者(主)。我认为这是因为java的pass-by-value功能。 我甚至尝试过布尔类型,但同样存在问题!

实际上我会用它来管理并发线程的排序。主处理器将检查每个线程的布尔值,以查看是否可以继续并勾选时钟。在勾选时钟后,主将使变量变为假,并将等到变量再次为真。如果子线程的布尔值都为假,则子线程将启动它们的任务。任务完成后,他们将使变量为真,以便主处理器能够再次打勾。 所以我想要一些没有回报的东西。我的意思是当主要可以看到方法内的值发生变化时。

5 个答案:

答案 0 :(得分:1)

boolean var = true;
var = methodWhichReturnsTheNewValueOfTheVariable();

并且在被调用的方法中:

return newBooleanValue;

SomeObjectWithBooleanVariableInside var = new SomeObjectWithBooleanVariableInside(true);
methodWhichModifiesTheObject(var);

并且在被调用的方法中:

var.setBooleanValue(newBooleanValue);

布尔值就是这样一个对象:它包含一个布尔值。但它有意设计为不可变:它的包装布尔值无法更改。所以你需要创建自己的功能对象。

答案 1 :(得分:0)

通常的做法如下:

public static void main(String[] args) {
    boolean myVar = true;

    ...
    ...

    myVar = myFunction();
}

public static boolean myFunction() {
    // the method should do it's calculation and return the value:
    return false;
}

答案 2 :(得分:0)

是的 - 您无法在Java中修改方法内的pass-by-value参数(例如在C#中您将编写method(ref param))。

为什么不能使用以下方法返回此值:

public boolean method(params...) {...}

或者您可以将参考传递给调用者:

public void method(params..., CallerClass caller) { 
    //do something
    caller.setValue(Boolean.FALSE);
}

或者你可以在调用者和调用方法范围 - 静态变量等

中访问这个变量

答案 3 :(得分:0)

原始类型按值传递,因此您无法更改作为方法中参数的变量。

这也更容易理解程序的工作原理,因为这种行为在这样的调用中变得更加明显:

boolean prime = false;
prime = isPrime(number);

您可以看到found变量已重新分配;虽然你可以假设number将保持不变。这有助于代码可读性。

有时可以使用肮脏的技巧。由于数组是对象,因此可以使用数组来包装基本类型:

boolean[] prime = { false };
isPrime(number, result);

public void isPrime(int number, boolean[] result) {
    result[0] = true;
}

对象引用也是按值传递的,但是这里我们更改数组的内容,而不是数组引用。

这很有效。但是,我不建议像这样设计你的代码。 有时候,知道这个技巧在单元测试中会很有用。

答案 4 :(得分:0)

当您认为更改了原始布尔值时,它只更改了该方法范围内的值。与布尔一样,因为它是不可变的。更改其值实际上在该方法的范围内为其分配了一个新值。 你应该从该方法返回新值,然后分配它,或者你也可以使用一个众所周知的全局布尔值来改变它。

(顺便说一下,如果你正在处理并发检查AtomicBoolean)