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;
//...
}
}
# 2
just write your own Observer/Observable
# 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);
}
# 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?
# 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!
# 6
Am I right that you want to avoid using the Observable interface?null
# 7
Ya. You are right. Just Observer interface and Subject abstract class.
# 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);
}
# 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