1

パラメータとしてフィールド オブジェクトを期待する public static メソッドを使用してオブジェクト インスタンスを見つけることは可能ですか?

それが私が検索するものです:

public class Foo {
    private Bar myObject;

    public static Foo get(Bar bar) {
        // return an instance of Foo which has stored a
        // reference to bar inside myObject or null if not found
    }
}

私の懸念を理解していただければ幸いです。Google は役に立ちませんでした。Java Reflection を使用した解決策があると思います。助けてくれてどうもありがとう。

4

5 に答える 5

2

いいえ、これを知る方法はありません。

特定のBarオブジェクトは、任意の数の のインスタンスによって参照される可能性がありFoo、実際にはまったく参照されない可能性があります。からへの参照を明示的に持っていない限り、それらを見つける方法はありません。BarFoo

(もちろん、Fooシステム内のすべてのインスタンスについて知っている場合は、その方法で検索できます...)

于 2013-02-17T13:32:21.867 に答える
0

これがリフレクションに関係しているのかどうかはわかりません。自分を追跡する必要があるだけなFooので、作成されたすべてのFooの静的マップを保持する必要があります。

public class Foo {
  private static final Map<Bar, Foo> BAR_FOO_MAP = new HashMap<>();
  private final Bar bar;

  private Foo(final Bar bar) {
   this.bar = bar;
  }

  public static Foo newInstance(final Bar bar) {
   final Foo foo = new Foo(bar);
   BAR_FOO_MAP.put(bar, foo);
   return foo;
  }
  public static Foo findFoo(final Bar bar) {
   return BAR_FOO_MAP.get(bar);
  }
}

他の人が指摘しているように、unqiueマッピングがない限り、これは機能しません-Map<Bar, Collection<Foo>>またはグアバ Multimapを使用する必要があるかもしれません。

于 2013-02-17T13:37:16.000 に答える
0

いいえ、私は思いませんが、既知のオブジェクトのリストがある場合(たとえば、静的リストを使用してすべての新しいインスタンスを追加する場合)、バーをフィールドオブジェクトと比較する検索方法を作成できます。または単に作成することもできます。このメソッドの新しいインスタンス:)

于 2013-02-17T13:39:34.023 に答える
0

簡単ではありません。私の腸の反応は、非常に特殊なケースがない限り、おそらく間違った方法で問題に取り組んでいるということです。

本当にこれを行う必要がある場合は、インストルメンテーションを使用して、Fooを参照する可能性のある関心のあるクラスのコンストラクターを登録し、作成されたオブジェクトへの参照をどこかに保持することができます。

次に、必要に応じてこれらすべての参照をステップスルーし、リフレクションを使用して、目的のフィールドタイプが含まれているかどうかを確認できます。

それはきれいではなく、効率的ではなく、ほとんどの場合完全に非現実的ですが、純粋に技術的な観点から質問に答えることが私がそれを行うために考えることができる唯一の方法です。

于 2013-02-17T13:35:15.710 に答える
0

いいえ、そのようにフィールドをバックトラックすることはできません。メソッドが受け取る参照は、渡された参照のbarコピーです。同じオブジェクトへの参照が多数ある場合もあれば、まったくない場合もあります。システム内のすべてのオブジェクトのリストを持っている場合、どのオブジェクトが同じ参照を持っているかを (リフレクションを介して、プライベートであるため)見つけることができますが、1 つ以上のオブジェクトがあったか、1 つもなかった可能性があります。受け取った がインスタンスによって参照されていることを知る方法はありません。また、それらの 1 つによってのみ参照される理由もありません。getBarFoomyObjectFoobarFoo

于 2013-02-17T13:32:11.767 に答える