creo que la solución más simple de todos ellos se ha perdido un poco ...
Usted no necesita más que eso en el 95% de la casos:
public class Aminal extends Observable {
public void doSomethingThatNotifiesObservers() {
setChanged();
notifyObservers(new Integer(42));
}
}
que supongo que no tendrá el boxeo auto, así que hice un objeto Integer
, pero parte de eso, la clase Observable
es de JDK1.0 por lo que debe estar presente en su versión de Java.
Con autoboxing (en Java 1.5 y posterior) la llamada notifyObservers
se vería así:
notifyObservers(42);
Con el fin de capturar el evento enviado es necesario implementar la interfaz Observer
:
public class GetInt implements Observer {
@Override
public void update(Observable o, Object arg) {
if (arg instanceof Integer) {
Integer integer = (Integer)arg;
// do something with integer
}
}
}
A continuación, agregará GetInt
a la clase Animal
:
Animal animal = new Animal();
GetInt getint = new GetInt();
animal.addObserver(getint);
Esto es todo Java estándar y la clase Observable
implementa todo el manejo de observadores que necesita.
Si tiene que ser capaz de desencadenar Observable
desde fuera, ir con una solución de Steve McLeod, pero en mi experiencia que desea que su clase de manejar lo que sabe y dejar que otras clases de interactuar con él a través de los Observer
interfaces.
Lo único que debe tener en cuenta es que debe llamar al setChanged()
antes de o Observable
no enviará ningún evento.
Creo que esto es para que pueda llamar a varios setChanged()
y luego notificar a los observadores una sola vez, haciéndoles saber que la clase ha cambiado y dejando que ellos entiendan cómo.
También es una buena forma de eliminar al observador una vez que la clase donde se creó ya no es necesaria, esto para evitar que el observador se quede en el observable. Solo la basura que recoge la clase de observador no lo eliminará de lo observable.
Si desea observar la clase por propiedad, le recomiendo ir con PropertyChangeSupport
según lo descrito por Adamski arriba. También hay un VetoableChangeSupport
que puede usar si desea que los oyentes puedan bloquear un cambio.
Santa mierda. Eso es mucho código para simplemente implementar un evento. Creo que voy a volver corriendo a C# :). En realidad, hace lo que necesito, excepto que tendré que convertirlo a la era anterior a los genéricos (estoy escribiendo para BlackBerry, todavía están en Java 1.3. – AngryHacker
Me alegro de que el código te ayude. puede usar el código del observable para todos sus observables, ya no es tanto código. Incluso puede cortar el código de notificación y simplemente seguir con java.lang.Objects. Para convertir el código a Java 1.3, creo que tiene que elimine las anotaciones @Override y use listas/colecciones basadas en Objetos. –
Su clase auxiliar Observable podría lanzar una ConcurrentModificationException si un Observer notificado intenta eliminarse durante la devolución de llamada de notificación. Puede solucionar esto utilizando CopyOnWriteArrayList. – Adamski