0

これはとてもばかげているかもしれません。メインメソッド内にブール変数があります。このクラスまたは別のクラスの別のメソッドを呼び出すことで、メイン メソッドでブール値を変更したいと考えています。私はこれを行いますが、変更は呼び出し元 (メイン) ではなく、呼び出されたメソッド (ローカル) でのみ発生します。これはJavaの値渡し機能によるものだと思います。ブール型も試しましたが、同じ問題がありました!

実際には、これを使用して同時スレッドの順序を管理します。メインプロセッサは、すべてのスレッドのブール値をチェックして、続行してクロックを刻むことができるかどうかを確認します。時計を刻んだ後、メインは vars を false にし、vars が再び true になるまで待機します。サブスレッドは、それぞれのブール値が false の場合にタスクを開始します。タスクが完了すると、vars が true になり、メイン プロセッサが再びティックできるようになります。だから私はリターンのないものが欲しい。つまり、メソッド内で値が変更されると、メインがそれを見ることができます。

4

5 に答える 5

1
boolean var = true;
var = methodWhichReturnsTheNewValueOfTheVariable();

呼び出されたメソッドの内部:

return newBooleanValue;

また

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

呼び出されたメソッドの内部:

var.setBooleanValue(newBooleanValue);

ブール値はそのようなオブジェクトです。ブール値が含まれています。ただし、意図的に不変として設計されています。ラップされたブール値は変更できません。したがって、独自の機能オブジェクトを作成する必要があります。

于 2012-12-23T15:13:16.243 に答える
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;
}
于 2012-12-23T15:14:55.437 に答える
0

はい-Javaのメソッド内で値渡しパラメーターを変更することはできません(たとえば、C#では次のように記述しますmethod(ref param))。

次のメソッドを使用してこの値を返すことができないのはなぜですか。

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

または、パラメータで呼び出し元への参照を渡すことができます。

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

または、呼び出し元と呼び出し元のメソッドスコープ(静的変数など)でこの変数にアクセスできるようにすることもできます。

于 2012-12-23T15:15:46.750 に答える
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;
}

オブジェクト参照も値によって渡されますが、ここでは、配列参照ではなく、配列の内容を変更します。

これは機能します。ただし、このようにコードを設計することはお勧めしません。ただし、このトリックを知っていると、単体テストで役立つ場合があります。

于 2012-12-23T15:18:03.003 に答える
0

プリミティブブール値を変更したと思うと、そのメソッドのスコープ内の値のみが変更されました。不変であるため、ブール値と同じです。その値を変更すると、実際にはそのメソッドのスコープ内で新しい値が割り当てられます。そのメソッドから新しい値を返してから割り当てる必要があります。または、すべてに知られているグローバルブール値を使用してその値を変更することもできます。

(ちなみに、同時実行を扱っている場合は、AtomicBoolean をチェックしてください)

于 2012-12-23T17:21:16.233 に答える