Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsWhite Papers
Discussion GroupsFirst AidDatabasesJavaBeansGUIJava 3DVirtual MachineCORBASecurityToolsGeneral
Java DirectoryOpen Source ProjectsSample Book ChaptersUser GroupsWeb Resources
Related Topics
Databases.NETMore Topics ...

Java Forum / General / April 2007

Tip: Looking for answers? Try searching our database.

generics observer/ observable

Thread view: 
yancheng.cheok@gmail.com - 27 Apr 2007 16:02 GMT
Hi all

I wish to have 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

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);
}
Hendrik Maryns - 27 Apr 2007 17:13 GMT
yancheng.cheok@gmail.com schreef:
>  Hi all
>
[quoted text clipped - 18 lines]
>  */
> public class Subject<TObserver extends Observer<T>, T> {

Why do you have the TObserver type variable here?  It makes everything
overly complicated.  Just remove it.

public class Subject<T> {

>     /** Creates a new instance of Subject */

If your comments are as useful as this one, you can as well leave them out.

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

It is easier to do this at the declaration.

>     }
>
>     public void attach (TObserver observer)

public void attach (Observer<T> observer)

>     {
>         observers.add(observer);
>     }
>
>     void _notify (T arg)

May I suggest you use Java naming conventions, not C++ ones?

private void notify (T arg)

>     {
>         for(java.util.Iterator< TObserver > iterator =
> observers.iterator(); iterator.hasNext(); ) {
>             iterator.next().update(this, arg);
>         }

If you use generics, you can use the new foreach syntax as well:

for(Observer<T> obs : observers) {
  obs.update(this, arg);
}

>     }
>
>     private List<Observer<T>> observers;

   private List<Observer<T>> observers = new
CopyOnWriteArrayList<Observer<T>>();

> }
>
[quoted text clipped - 6 lines]
> public interface Observer<T> {
>     public void update(Subject<T> subject, T arg);

> }

Hope that helps.

You can now create a new Subject as follows:
temp = new Subject<Temperature>();
temp.attach(new Observer<Temperature>())

Hm, this is still not satisfactory, since how is the Temperature going
to call notify?

After some guesses about how C++ templating works, I came up with the
following, which seems to behave correctly:

package jstock;

public interface Observer<T> {
   public void update(T arg);
}

package jstock;

import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

public class Subject<T> {

   public void attach(Observer<T> observer) {
       observers.add(observer);
   }

   void notify(T arg) {
       for (Observer<T> obs : observers) {
           obs.update(arg);
       }
   }

   private List<Observer<T>> observers = new
CopyOnWriteArrayList<Observer<T>>();

}

package jstock;

public class Temperature extends Subject<Temperature> {

   void temperatureChanged() {
       notify(this);
   }

   void getTemperature() {
       System.out.println("Getting the temperature.");
   }

}

package jstock;

public class PanicSirene implements Observer<Temperature> {

   public void update(Temperature subject) {
       System.out.println("Temperature was changed, sound the sirene");
       subject.getTemperature();
   }

   static public void main(String[] args) {
       Temperature       temp = new Temperature();
       PanicSirene       panic = new PanicSirene();

       temp.attach (panic);

       temp.temperatureChanged ();

   }

}

And it seems to work:

test Java> java jstock/PanicSirene
Temperature was changed, sound the sirene
Getting the temperature.

Phieuw, quite some more work than I thought
H.
- --
Hendrik Maryns
http://tcl.sfs.uni-tuebingen.de/~hendrik/
==================
http://aouw.org
Ask smart questions, get good answers:
http://www.catb.org/~esr/faqs/smart-questions.html
yancheng.cheok@gmail.com - 27 Apr 2007 18:37 GMT
Hey, that was really cool! Thanks man!
Daniel Pitts - 27 Apr 2007 22:17 GMT
On Apr 27, 9:13 am, Hendrik Maryns <hendrik_mar...@despammed.com>
wrote:
> yancheng.ch...@gmail.com schreef:
> >     void _notify (T arg)
>
> May I suggest you use Java naming conventions, not C++ ones?
>
> private void notify (T arg)

Actually, I would suggest choosing another name altogether.  There is
a method called notify in the Object class.  It might be better to
call it void observe(T arg);
jacma983@yahoo.fr - 28 Apr 2007 02:44 GMT
> On Apr 27, 9:13 am, Hendrik Maryns <hendrik_mar...@despammed.com>
> wrote:
[quoted text clipped - 9 lines]
> a method called notify in the Object class.  It might be better to
> call it void observe(T arg);

nitpicking  but...

In the Observer/Observable pattern it's the observer
that observes the subject: not the other way round.

So maybe notifyObservers() ?


Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.