2010-03-04 15 views
28

Estaba charlando con un colega sobre el diseño de las bibliotecas de Javas. Mencioné que siempre me pareció divertido que las clases AWT/Swing llamadas que esencialmente proporcionan una interfaz Observable en un widget UI en realidad se llamaran "oyentes".¿Se usa java.util.Observable en cualquier lugar?

Con lo que me impresionó señalando que habría habido un choque de nombre con java.util.Observer y java.util.Observable, que han existido desde JDK 1.0. Nunca había oído hablar de ellos antes.

No hay usos enumerados en los JavaDocs y google/googlecode que no aparecen, ¿alguien sabe si se utilizan en alguna parte del JDK? No parecen haber recibido ningún amor genérico, por lo que, presumiblemente, no son "populares". ¿Alguien los ha encontrado útiles?

+0

Puedes considerar informarlo aquí también: http://stackoverflow.com/questions/1697215/what-is- your-favorite-java-api-fastidio – ewernli

+0

Gracias, pero no es tan irritante. Solo un poco triste – MHarris

+1

Los encontré útiles en 1996, antes de que JavaBeans y AWT 2.0 hicieran soporte para el cambio escuchando una característica más generalizada del lenguaje. Piense en ellos como el prototipo de todas las interfaces de escuchas de eventos que ve hoy en todo el JDK. Son de interés histórico solamente. –

Respuesta

12

Observer y Observable se siguen utilizando en muchos códigos de asistente de Eclipse para detectar cuándo cambia el contenido de los cuadros de entrada, por lo que el asistente puede actualizarse. He tenido que trabajar con algunas de estas cosas, cambiándolas por nuestras propias necesidades ... :)

18

No se utilizan, porque su diseño es defectuoso: no son type safe. Puede adjuntar cualquier objeto que implemente Observer a cualquier Observable, lo que puede provocar errores sutiles en la línea.

Envolverlos dentro de una interfaz tipo segura es casi la misma cantidad de trabajo que implementar el patrón desde cero, así que supongo que este último es el preferido en la mayoría de los casos.

Esta es una de las cosas defectuosas en Java 1.0 debido a las opciones de diseño subóptimas realizadas bajo presión de tiempo (otras incluyen Java 1.0 Collection API y java.util.Date), pero debido a la naturaleza de las API públicas puede nunca más ser eliminado (solo desaprobado).

+1

@ Péter Török: Solo puede adjuntar un objeto que implemente la interfaz * Observer * a * Observable *, esto es perfectamente normal. Espero que enviándolos dentro de una interfaz tipo segura no estés pensando en usar genéricos, porque no funciona para el observador/observable debido al borrado de tipo (bueno, funciona, pero solo para casos triviales simples, donde el básico Observable también funciona). Pero concedido, es tan fácil de implementar desde cero usando un COWAL que no tiene mucho sentido usar estos viejos restos de 1.0. – SyntaxT3rr0r

+0

@WizardOfOdds Sé esto. Edité el código, espero que ahora esté más claro. –

+1

@WizardOfOdds: El uso de genéricos para un observador/observador es que el observador generalmente debe tener acceso a lo observable como lanzado a su tipo relevante en este contexto. Dado que la implementación del patrón JDK no proporciona genéricos, plantea problemas ClassCast fácilmente. –

Cuestiones relacionadas