Observer está en desuso en Java 9. ¿Qué debemos usar en lugar de él?

Respuestas:

104

¿Porqué es eso? ¿Significa que ya no deberíamos implementar un patrón de observación?

Respondiendo la última parte primero:

, significa que ya no debes implementarObserveryObervables.

¿Por qué estaban en desuso ?

No proporcionaron un modelo de evento suficientemente rico para las aplicaciones. Por ejemplo, podrían apoyar solo la noción de que algo ha cambiado, pero no transmitieron ninguna información sobre lo que ha cambiado.

La respuesta de Alex lo pone muy por adelantado que Observertiene una debilidad: todos Observableson iguales . Debe implementar la lógica que se basa instanceofy convertir el objeto a tipo concreto en Observable.update()método.

Para agregarlo, había errores como uno no podía serializar laObservable clase porque no implementaba la Serializableinterfaz y todos sus miembros eran privados.

¿Cuál es una mejor alternativa a eso?

Por otro lado, Listenerstienen muchos tipos y tienen métodos de devolución de llamada y no requieren conversión. Como lo señaló @Ravi en su respuesta , puede utilizar en su PropertyChangeListenerlugar.

Para el resto, se @Deprecationha marcado con la documentación adecuada para explorar otros paquetes como se vinculan en otras respuestas también.


Tenga en cuenta que la desaprobación también se marcó con un análisis como se indica en este correo :

En estos días, cualquiera que se encuentre con estos probablemente los esté golpeando por error mientras usa RxJavau otros marcos de flujo reactivo. En ese caso, los usuarios normalmente querrán usar las java.util.concurrent.FlowAPI jdk9 para que todos los marcos de flujos reactivos sean compatibles / interoperables dentro de sus próximas versiones compatibles con jdk9.

Editar : También vale la pena mencionar que la desaprobación de las API no se debe principalmente a la razón anterior, sino que también es incapaz de mantener el código heredado como se menciona en los comentarios de algunos de los informes de errores (vinculados anteriormente) que se plantearon a marcar una mejora en su implementación de una u otra manera.

Naman
fuente
3
+1. Buena respuesta, aunque todavía estoy tratando de entenderlo. ¿El observador en Java está en desuso debido a algún problema inherente del patrón de diseño en sí (como lo define GOF en el libro) o el problema del soporte para el patrón por parte de Java? En otros lenguajes OO, como C #, C ++, Python, ¿el patrón de diseño del observador también tiene el mismo problema que en Java?
Tim
25
El hecho de que una implementación particular esté en desuso no significa que el patrón del Observador tenga fallas fatales. ListenerTambién es un observador.
chrylis -cautiouslyoptimistic-
@chrylis Gracias, no podría estar más de acuerdo, una de las razones principales para desaprobar la API también es el mantenimiento adjunto y que cambiar su implementación podría haber estado rompiendo otro código.
Naman
@ curious95 No se puede entender la forma de notificar concurrente allí.
Naman
44
@ curious95 Sí, las llamadas notifyObservers()son concurrentes. Aquí hay un codelet del mismo compartido para explicar su funcionalidad en detalles.
Naman
37

Sí, está en desuso en Java 9 . Y ya no podemos implementar el patrón de observador.


¿Porqué es eso?

Hay mas razones:

No serializable : desde entonces, Observable no implementa Serializable. Por lo tanto, no se puede serializar Observable ni su subclase.

Sin seguridad de subprocesos : sus subclases pueden anular los métodos, y la notificación de eventos puede ocurrir en diferentes órdenes y posiblemente en diferentes subprocesos, lo cual es suficiente para interrumpir cualquier "seguridad de subprocesos".

Menos de una oferta -

No proporcionan un modelo de eventos suficientemente rico para las aplicaciones. Por ejemplo, solo admiten la noción de que algo ha cambiado, pero no transmiten ninguna información sobre lo que ha cambiado.

Problemas abiertos : como se mencionó, se plantearon muchos problemas importantes (seguridad de subprocesos, serializable) y la mayoría de ellos tenían complejidades para solucionar y todavía "no se solucionaron" o no hubo desarrollo activo , y esa es la razón por la que se ha desaprobado .

También recomendaría leer esta respuesta ¿Por qué el patrón de observador debe ser obsoleto? , @Jeff ha explicado otras razones para la desaprobación.


Entonces, ¿cuál es la alternativa que tenemos?

Puede usar PropertyChangeEventy PropertyChangeListenerdesde el java.beanspaquete.

Ravi
fuente
PropertyChangeListenerreemplaza Observer, pero ¿qué debo extender / implementar en lugar de Observable?
LastStar007
Actualización: creo que el enfoque es agregar una PropertyChangeSupportvariable como instancia, pero agradecería una confirmación.
LastStar007
3
@ LastStar007 Creo que tienes razón. Encontré un ejemplo de código en Baeldung.com que hace exactamente eso.
Dragos Stanciu
13

¿Por qué Observer está en desuso en Java 9?

Respuesta: La Observableclase y la Observerinterfaz han quedado en desuso en Java 9 porque el modelo de eventos soportado por Observery Observablees bastante limitado, el orden de las notificaciones entregadas Observableno está especificado y los cambios de estado no están en correspondencia uno a uno con las notificaciones.

Consulte el documento de Java https://docs.oracle.com/javase/9/docs/api/java/util/Observable.html

Alterno del patrón de observador?

Hay muchas alternativas del patrón de diseño de Observer y Reactive Streams es una de ellas.

Secuencias reactivas o API de flujo :

Flowse introdujo una clase en Java 9 y tiene 4 interfaces relacionadas entre sí: Processor, Publisher, Subscribery Subscription.

Flow.Processor : Un componente que actúa como suscriptor y editor.

Flow.Publisher : Un productor de artículos recibidos por los suscriptores.

Flow.Subscriber : Un receptor de mensajes.

Flow.Subscription: Control de mensajes que vincula a Flow.Publishery Flow.Subscriber.

Consulte el documento de Java https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/Flow.html

Mohit Tyagi
fuente
7

Teniendo en cuenta que la Observableclase y la Observerinterfaz han quedado en desuso a partir de Java 9. Según la publicación, el observador y el observable de Java están en desuso en JDK 9

El modelo de eventos admitido por Observer y Observable es bastante limitado, el orden de las notificaciones entregadas por Observable no está especificado y los cambios de estado no están en correspondencia uno a uno con las notificaciones. Para un modelo de evento más rico, considere usar el java.beans paquete. Para una mensajería confiable y ordenada entre hilos, considere usar una de las estructuras de datos concurrentes en el java.util.concurrentpaquete. Para la programación de estilo de secuencias reactivas, consulte la API de Flow

Ousmane D.
fuente