generics observer/ observable

hi all,

is there any possibly, that i am able to convert the exsiting observer/ observable which is found under

http://java.sun.com/j2se/1.4.2/docs/api/java/util/Observer.html

http://java.sun.com/j2se/1.4.2/docs/api/java/util/Observable.html

to a generics version of observer/ observable pattern? just like the one which is implemented in c++ template.

http://www.codeproject.com/cpp/observer_with_templates.asp

thank you very much!

cheok

[488 byte] By [KwangHooia] at [2007-11-27 2:24:42]
# 1

May be something like this:

public interface Observer<T> {

void update(Observable<T, Observer><T>> o, T arg);

}

public interface Observable<T, TObserver extends Observer><T>> {

void addObserver(TObserver o);

void deleteObserver(TObserver o);

void deleteObservers();

boolean hasChanged();

void notifyObservers() ;

void notifyObservers(T arg) ;

int countObservers() ;

}

public class Main {

public static void main(String[] args) {

Observer<String> stirngObserver;

Observable<String, Observer><String>> stirngObservable;

//...

}

}

raindropa at 2007-7-12 2:32:03 > top of Java-index,Core,Core APIs...
# 2
just write your own Observer/Observable
georgemca at 2007-7-12 2:32:03 > top of Java-index,Core,Core APIs...
# 3

I tried the following implementation. However, I get the following compilation error. May I know what wrongs?

C:\Documents and Settings\yccheok\Desktop\java\observer\src\jstock\Subject.java:31: update(jstock.Subject<jstock.Observer><T>,T>,T) in jstock.Observer<T> cannot be applied to (jstock.Subject<TObserver,T>,T)

package jstock;

/**

*

* @author yccheok

*/

public class Subject<TObserver extends Observer><T>, T> {

/** Creates a new instance of Subject */

public Subject() {

observers = new java.util.concurrent.CopyOnWriteArrayList< TObserver >();

}

public void attach (TObserver observer)

{

observers.add(observer);

}

void _notify (T arg)

{

for(java.util.Iterator< TObserver > iterator = observers.iterator(); iterator.hasNext(); ) {

iterator.next().update(this, arg);

}

}

private java.util.List< TObserver > observers;

}

package jstock;

/**

*

* @author yccheok

*/

public interface Observer<T> {

public void update(Subject< Observer<T>, T > subject, T arg);

}

KwangHooia at 2007-7-12 2:32:03 > top of Java-index,Core,Core APIs...
# 4

I have updated the Observer and Observable classes to make them easier:

public interface Observer<T> {

void update(Observable<T> o, T arg);

}

public interface Observable<T> {

void addObserver(Observer<T> o);

void deleteObserver(Observer<T> o);

}

So your code could be rewritten without compiler errors:public class Subject<T> implements Observable<T> {

/** Creates a new instance of Subject */

public Subject() {

observers = new java.util.concurrent.CopyOnWriteArrayList< Observer<T> >();

}

public void attach (Observer<T> observer)

{

observers.add(observer);

}

void _notify (T arg)

{

for(java.util.Iterator< Observer<T> > iterator = observers.iterator(); iterator.hasNext(); ) {

iterator.next().update(this, arg);

}

}

public void addObserver(Observer<T> o) {

}

public void deleteObserver(Observer<T> o) {

}

private java.util.List<Observer><T> > observers;

}

The _notify method from Subject class could also use the enhanced loop:void _notify (T arg){

for(Observer<T> o : observers){

o.update(this, arg);

}

}

Does it help?

raindropa at 2007-7-12 2:32:03 > top of Java-index,Core,Core APIs...
# 5
Thanks. Will try it out tonight since I do not have compiler right now. By the way, do you know how I can avoid the compiler error message, but just merely change the syntax, without adding another new interface class?Thanks!
KwangHooia at 2007-7-12 2:32:03 > top of Java-index,Core,Core APIs...
# 6
Am I right that you want to avoid using the Observable interface?null
raindropa at 2007-7-12 2:32:03 > top of Java-index,Core,Core APIs...
# 7
Ya. You are right. Just Observer interface and Subject abstract class.
KwangHooia at 2007-7-12 2:32:03 > top of Java-index,Core,Core APIs...
# 8

Type casting could help to avoid the compiler error. But it is not a good decision. for(java.util.Iterator< TObserver > iterator = observers.iterator(); iterator.hasNext(); ) {

iterator.next().update(( Subject<Observer><T>, T>)this, arg);

}

raindropa at 2007-7-12 2:32:03 > top of Java-index,Core,Core APIs...
# 9

Oh, I have another solution from someone else. That was cool! Thanks to raindrop for those +ve inputs

package jstock;

/**

*

* @author yccheok

*/

public interface Observer<S, A> {

public void update(S subject, A arg);

}

public class Subject<S, A> {

public void attach(Observer<S, A> observer) {

observers.add(observer);

}

void notify(S subject, A arg) {

for (Observer<S, A> obs : observers) {

obs.update(subject, arg);

}

}

private List<Observer><S, A>> observers = new CopyOnWriteArrayList<Observer><S, A>>();

}

Message was edited by:

KwangHooi

KwangHooia at 2007-7-12 2:32:03 > top of Java-index,Core,Core APIs...