1
public interface Component{}

public class AppManager {


  public void doWork(){
    SomeComponent comp = new SomeComponent ();
    AddComponentToList(comp);

  }

  public void AddComponentToList(Component compo){
     componentList.add(compo);
  }

  /* Give me the component I want. */
  public Component getComponent(Component comp){
    for (Component component : getComponentList()) {

        if (component instanceof comp) {
          return component;  
        }

    }


  }

   private ArrayList<Component> componentList  = new ArrayList<Component>();

}

public class SomeComponent implements component {

  public void MyMethod() {

     appManager.getComponent(SomeComponent );
  }


  public void setAppMnger(AppManager appm){
     this.appManager = appm;
  }

  private AppManager appManager ;
}

上記のコードでは、AppMnger はコンポーネントのリストを持っています。コンポーネントは相互に通信しています。したがって、あるコンポーネントが別のコンポーネント インスタンスを知りたい場合は、AppMnger の getComponent(comp) メソッドを呼び出します。しかし、instanceof 演算子を使用するとエラーが発生します。各コンポーネントにリストを比較させたくありませんが、そのタスクを AppMnger に委任したいと考えています。AppMnger は、作成したコンポーネントについて知っているからです。エイミーは思った?

4

3 に答える 3

3

ではなくgetComponentを取るように再設計する必要があると思います。次に、次を使用できます。Class<? extends Component>ComponentisInstance

public Component getComponent(Class<? extends Component> componentClass) {
    for (Component component : getComponentList()) {
        if (componentClass.isInstance(component)) {
           return component;  
        }
    }
    return null; // Or throw an exception, potentially.
}

そしてSomeComponent使用します:

appManager.getComponent(SomeComponent.class);

本当にインスタンスを使用したい場合は、次のようにメソッドをオーバーロードできます。

public Component getComponent(Component existingComponent) {
    return getComponent(existingComponent.getClass());
}

編集:実際に正確なクラスのみを確認したい場合は、-のような動作は必要ありませんinstanceof-必要なのは:

public Component getComponent(Class<? extends Component> componentClass) {
    for (Component component : getComponentList()) {
        if (componentClass == component.getClass()) {
           return component;  
        }
    }
    return null; // Or throw an exception, potentially.
}

それでも、このメソッド シグネチャを使用することをお勧めします。目的のタイプのコンポーネントを見つけるために、コンポーネントのインスタンスがすでに存在している必要があるのは非常に奇妙に感じられます。

于 2013-09-19T07:39:44.057 に答える
2

クラスを正確に一致させたい場合 (List != ArrayList)、これを使用します。

if (comp.getClass().equals(component.getClass())) ...

instanceof (List => ArrayList) とまったく同じように動作させたい場合は、これを試すことができます。

if (comp.getClass().isInstance(component)) ...
于 2013-09-19T07:40:28.467 に答える