4

次のコードを書きたいと思います。

boolean found = false;
search(new SearchCallback() {
  @Override void onFound(Object o) { found = true; }
});

foundである必要があるため、明らかにこれは許可されていませんfinalfoundスレッド セーフの理由から、メンバー フィールドを作成できません。最良の代替手段は何ですか? 1 つの回避策は、定義することです。

final class MutableReference<T> {
  private T value;
  MutableReference(T value) { this.value = value; }
  T get() { return value; }
  void set(T value) { this.value = value; }
}

しかし、これは適切にフォーマットすると多くのスペースを占有することになり、できれば車輪を再発明したくありません。List<Boolean>a を単一の要素 (その要素を変更するか、リストを空にする) またはa で使用することもできますBoolean[1]。しかし、どのオプションも意図したとおりに使用されていないため、すべてがおかしいようです。

これを行うための合理的な方法は何ですか?

4

4 に答える 4

4

あなたが言及したboolean [1]メソッドを実行する傾向があります:

final boolean[] found = {false};
search(new SearchCallback() {
  @Override void onFound(Object o) { found[0] = true; }
});

少しハックですが、実際に必要なものに最も近いものになる傾向があります

于 2010-05-04T02:48:38.803 に答える
3

あなたはすべて機能することができます:

Boolean found = search(new SearchCallback<Boolean>() {
    @Override Boolean onFound(Object o) { return true; }
});

通常、囲んでいる変数を変更したい場合は、そうしないことで解決策をより明確に表現できます。

于 2010-05-04T03:34:19.883 に答える
2

すべての解決策は確かにハックですが、配列はそれを処理する「標準的な」教科書の方法であり、プレジェネリックであってもタイプセーフでした。

この状況での別のオプションは、次のようにプライベート クラスを作成することです。

   private class Searcher implements SearchCallback {
        private boolean found;
        @Override public void onFound(Object o) { found = true; }
        public boolean search() {
              OuterClass.this.search(this);
              return found;
        }
   }

そして、次のように使用します。

  boolean found = new Searcher().search();

編集:トムのコメントを正しく理解している場合、彼はこれを代替案として提案しています

 public void foo() { //This is the method that enclosed the code in your question
     new SearchCallBack() {
         private boolean found;
         @Override public void onFound(Object o) { found = true; }
         {
            //The code that was before this in your method
            search(this);
            //The code that was after this in your method
         }
     };
 }

それはもっとハックだと思いますし、そのようなコードは本当に珍しいと思いますが、それがオプションであることを知っておくことは間違いなく価値があります.

于 2010-05-04T03:00:32.833 に答える
0

フィールドを本当に使用できない場合、マイケルの答えは正しいようです。

ともかく。どの署名に触れることができるかはわかりませんが、そのコールバックは、見つかったオブジェクトに対して(検索が成功したときに)何かを行うことを意図しているようです。代わりに、検索メソッドの呼び出し元に、何かが見つかったことを通知するつもりです。あなたの seach( )メソッドがブール値を返すように作られていれば、もっと自然に思えます(検索が成功した場合、メソッドは確実にどこかで s.onFound() を呼び出し、そこに内部の見つかったフラグを設定してそれを返します)。

于 2010-05-04T03:04:51.670 に答える