Je viens de remarquer que java.util.Observable est une classe concrète. Puisque le but d'Observable est d'être étendu, cela me semble plutôt étrange. Y a-t-il une raison pour laquelle elle a été implémentée de cette façon ?
J'ai trouvé cet article qui dit que
L'observable est une classe concrète, donc la classe qui en dérive doit être déterminée au préalable, car Java ne permet qu'un seul héritage.
Mais ça ne l'explique pas vraiment pour moi. En effet, si Observable était abstrait, l'utilisateur serait obligé de déterminer la classe qui en dérive.
6 votes
Je pense que ça aurait dû être une interface. C'est l'un de ces domaines auxquels on n'a pas assez réfléchi.
4 votes
Il ne peut pas être une interface, car il doit garder la trace des observateurs qui lui ont été ajoutés.
0 votes
Question intéressante. Au début, je pensais qu'il pouvait être utilisé "simplement", mais comme
setChanged()
esprotected
il n'y a aucun moyen d'utiliser un simpleObservable
en dehors de l'objetjava.util
paquet.11 votes
"Il ne peut pas s'agir d'une interface, car elle doit garder la trace des observateurs qui lui ont été ajoutés." Eh bien, ce serait le travail de l'implémentation de cette interface. Tout comme Collection a une méthode size() sans fournir une implémentation pour celle-ci.
0 votes
El javadoc pour Observable déclare que
It can be subclassed...
pas doit être. Il est utilisable sans sous-classe, vous aurez juste besoin de faire quelques castings supplémentaires.0 votes
@krock : Comme Joachim l'a dit, ce n'est pas vraiment utilisable seul, car on ne peut pas appeler
setChanged
(sauf à partir d'une sous-classe).13 votes
Il est vieux. Vraiment vieux. Et nous connaissons beaucoup de code dans les anciennes parties de Java que nous ferions mieux aujourd'hui. S'ils le changent pour
abstract
maintenant, cela peut casser beaucoup d'applications qui sortent (bien que je ne vois aucune raison d'instancierObservable
...).0 votes
@Thilo : concernant l'interface-vs-implementation : non seulement Observable doit garder la trace des Observateurs, mais il contient aussi la logique pour les notifier. Si ces deux éléments n'étaient pas inclus dans Observable, les principales responsabilités d'Observable seraient déplacées vers les classes qui l'implémentent.
0 votes
Oui, la responsabilité d'implémenter correctement l'interface est laissée aux classes d'implémentation. Je pense que s'ils la concevaient à nouveau, Observable serait une interface, et vous auriez une autre classe ObservableSupport que vous pourriez soit sous-classer pour obtenir son implémentation, soit utiliser comme délégué si vous voulez avoir une classe parente différente.
3 votes
Ce que j'essayais de dire, c'est qu'une interface Observable n'aurait pas vraiment d'intérêt. L'implémentation serait presque toujours la même. C'est en cela qu'elle diffère de Collection. Mais il serait logique qu'il y ait une implémentation par défaut disponible - la classe ObservableSupport que vous suggérez. Un peu comme les classes KeyListener/KeyAdapter.
0 votes
Ça aurait dû être une interface. Idéalement, un AbstractObserver devrait implémenter une interface (simple) Subject (conforme GoF). Alors on peut aussi utiliser Subject pour rendre d'autres interfaces observables, ce qui est maintenant impossible.