aboutsummaryrefslogtreecommitdiff
path: root/libjava/java/util/Observable.java
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/java/util/Observable.java')
-rw-r--r--libjava/java/util/Observable.java123
1 files changed, 90 insertions, 33 deletions
diff --git a/libjava/java/util/Observable.java b/libjava/java/util/Observable.java
index 1a205c1..5d4d49f 100644
--- a/libjava/java/util/Observable.java
+++ b/libjava/java/util/Observable.java
@@ -1,30 +1,49 @@
-/* Copyright (C) 1998, 1999 Free Software Foundation
+/* java.util.Observable
+ Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
- This file is part of libgcj.
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+As a special exception, if you link this library with other files to
+produce an executable, this library does not by itself cause the
+resulting executable to be covered by the GNU General Public License.
+This exception does not however invalidate any other reasons why the
+executable file might be covered by the GNU General Public License. */
-This software is copyrighted work licensed under the terms of the
-Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
-details. */
package java.util;
-
-/**
- * @author Warren Levy <warrenl@cygnus.com>
- * @date September 2, 1998.
- */
+
/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3
* "The Java Language Specification", ISBN 0-201-63451-1
* plus online API docs for JDK 1.2 beta from http://www.javasoft.com.
* Status: Believed complete and correct.
*/
-
+
+/**
+ * @author Warren Levy <warrenl@cygnus.com>
+ * @date September 2, 1998.
+ */
public class Observable
{
- /* tracks whether this object has changed */
+ /** tracks whether this object has changed */
private boolean changed;
/* list of the Observers registered as interested in this Observable */
- private Vector observerVec;
+ private Vector observers;
/* TBD: This might be better implemented as an Observer[]
* but that would mean writing more code rather than making use of
@@ -34,63 +53,101 @@ public class Observable
* we may decide to make the tradeoff and reimplement with an Observer[].
*/
+ /**
+ * Constructs an Observable with zero Observers.
+ */
public Observable()
{
changed = false;
- observerVec = new Vector();
+ observers = new Vector();
}
- public synchronized void addObserver(Observer obs)
+ /**
+ * Adds an Observer. If the observer was already added this method does
+ * nothing.
+ *
+ * @param observer Observer to add.
+ */
+ public synchronized void addObserver(Observer observer)
{
- // JDK 1.2 spec says not to add this if it is already there
- if (!observerVec.contains(obs))
- observerVec.addElement(obs);
+ if (!observers.contains(observer))
+ observers.addElement(observer);
}
+ /**
+ * Reset this Observable's state to unchanged.
+ */
protected synchronized void clearChanged()
{
changed = false;
}
+ /**
+ * @return Number of Observers for this Observable.
+ */
public synchronized int countObservers()
{
- return observerVec.size();
+ return observers.size();
}
- public synchronized void deleteObserver(Observer obs)
+ /**
+ * Deletes an Observer of this Observable.
+ *
+ * @param victim Observer to delete.
+ */
+ public synchronized void deleteObserver(Observer victim)
{
- observerVec.removeElement(obs);
+ observers.removeElement(victim);
}
+ /**
+ * Deletes all Observers of this Observable.
+ */
public synchronized void deleteObservers()
{
- observerVec.removeAllElements();
+ observers.removeAllElements();
}
+ /**
+ * @return Whether or not this Observable has changed.
+ */
public synchronized boolean hasChanged()
{
return changed;
}
+ /**
+ * If the Observable has actually changed then tell all Observers about it,
+ * then resets state to unchanged.
+ */
public void notifyObservers()
{
notifyObservers(null);
}
- public void notifyObservers(Object arg)
+ /**
+ * If the Observable has actually changed then tell all Observers about it,
+ * then resets state to unchanged.
+ * Note that though the order of notification is unspecified in subclasses,
+ * in Observable it is in the order of registration.
+ *
+ * @param obj Arguement to Observer's update method.
+ */
+ public void notifyObservers(Object obj)
{
- if (changed)
- {
- /* The JDK 1.2 spec states that though the order of notification
- * is unspecified in subclasses, in Observable it is in the order
- * of registration.
- */
- for (int i = 0, numObs = observerVec.size(); i < numObs; i++)
- ((Observer) (observerVec.elementAt(i))).update(this, arg);
- changed = false;
- }
+ if (!hasChanged())
+ return;
+ Vector ob1 = (Vector) observers.clone();
+
+ for (int i = 0; i < ob1.size(); i++)
+ ((Observer) ob1.elementAt(i)).update(this, obj);
+
+ clearChanged();
}
+ /**
+ * Marks this Observable as having changed.
+ */
protected synchronized void setChanged()
{
changed = true;