How do I know the generic object that the Observer class sends in Java?

泪湿孤枕 提交于 2019-12-13 12:43:34

问题


I am implementing the Observer / Observable pattern using Java. However, I am encountering a problem in the Observer portion of my code.

Observable

public class Model extends Observable {

   public void notify() {
       this.setChanged();
       this.notifyObservers(new ArrayList<A>());
       this.notifyObservers(new ArrayList<B>());
   }
}

Observer

public class View implements Observer {

    @Override
    public void update(Observable observable, Object object) {
        // TODO: If object is ArrayList<A>?
        System.out.println("A");
        // TODO: If object is ArrayList<B>?
        System.out.println("B");
    }
}

How would I fill in the TODO comments to check for the generic on the ArrayList? Is this even possible? (I would prefer to do it without implementing more classes, if possible.)


回答1:


An Observable should send one and only one type of data.

public class ModelA extends Observable {

   public void notify() {
       this.setChanged();
       this.notifyObservers(new ArrayList<A>());
   }
}

public class ModelB extends Observable {

   public void notify() {
       this.setChanged();
       this.notifyObservers(new ArrayList<B>());
   }
}

Your other alternative is to put ArrayList<A> and ArrayList<B> into a class. You can notify your observers with that class.




回答2:


You could use instanceof to see what type is your object but you are misusing the pattern.
The idea is that the Observable has a well defined interface and all the Observer needs to know is to use the API to pass the notification.
Logic to know what exactly is the Observable should not be mixed in the code.
From your question sounds to me you have 2 Observable and they should keep their own listeners interested specifically in them for notification. Not one combined



来源:https://stackoverflow.com/questions/12113283/how-do-i-know-the-generic-object-that-the-observer-class-sends-in-java

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!