O Java 9 foi lançado e Observer
foi preterido. Por que é que? Isso significa que não devemos mais implementar o padrão de observador?
Seria bom saber o que é uma alternativa melhor?
fonte
O Java 9 foi lançado e Observer
foi preterido. Por que é que? Isso significa que não devemos mais implementar o padrão de observador?
Seria bom saber o que é uma alternativa melhor?
Por que é que? Isso significa que não devemos mais implementar o padrão de observador?
Respondendo a última parte primeiro -
SIM , isso não significa que você não deve implementarObserver
eObervable
é mais.
Por que eles foram reprovados -
Eles não forneceram um modelo de evento suficientemente rico para aplicativos. Por exemplo, eles poderiam apoiar apenas a noção de que algo mudou, mas não transmitiram nenhuma informação sobre o que mudou.
A resposta de Alex coloca bem à frente o que Observer
tem uma fraqueza: todos Observable
são iguais . É necessário implementar a lógica que se baseia instanceof
e converter o objeto em tipo concreto no Observable.update()
método.
Para adicionar a ele, havia erros como não se pode serializar aObservable
classe porque, por não implementar a Serializable
interface e todos os seus membros serem privados.
Qual é a melhor alternativa para isso?
Por outro lado, Listeners
existem muitos tipos, métodos de retorno de chamada e não requerem conversão. Como apontado por @Ravi em sua resposta, você pode usar PropertyChangeListener
.
No restante, @Deprecation
foi marcado com a documentação adequada para explorar outros pacotes, como também vinculados em outras respostas.
Observe que a descontinuação também foi marcada com uma análise, conforme declarado neste e-mail -
Atualmente, qualquer pessoa que os encontre provavelmente os encontrará por engano enquanto estiver usando
RxJava
ou outras estruturas de fluxo reativo. Nesse caso, os usuários normalmente desejam usar asjava.util.concurrent.Flow
APIs do jdk9 para que todas as estruturas de fluxos reativos sejam compatíveis / interoperáveis nas próximas versões compatíveis do jdk9 planejadas.
Edit : Também vale a pena mencionar que a descontinuação das APIs não se deve principalmente ao motivo acima, mas também a incapacidade de manter o código herdado mencionado nos comentários de alguns dos relatórios de erros (vinculados acima) que foram aumentados para marcar uma melhoria em sua implementação de uma ou de outra maneira.
Listener
também é um observador.notifyObservers()
é simultânea. Aqui está um codelet do mesmo compartilhado para explicar sua funcionalidade em detalhes.Sim, está obsoleto no Java 9 . E não podemos mais implementar o padrão de observador.
Por que é que?
Há mais razões:
Não serializável - Como o Observable não implementa serializável. Portanto, você não pode Serialize Observable nem sua subclasse.
Sem segurança de encadeamento - Os métodos podem ser substituídos por suas subclasses e a notificação de eventos pode ocorrer em ordens diferentes e possivelmente em encadeamentos diferentes, o que é suficiente para interromper qualquer "segurança de encadeamento".
Menos a oferecer -
Questões em aberto - Como mencionado, muitos dos principais problemas foram levantados (segurança de encadeamento, serializável) e a maioria deles possuía complexidades a serem corrigidas e ainda "não consertadas" ou sem desenvolvimento ativo , e é por esse motivo que ela foi descontinuada .
Eu também recomendaria ler esta resposta Por que o padrão de observador deve ser reprovado? , @Jeff explicou outras razões para a desvalorização.
Então, qual é a alternativa que temos?
Você pode usar
PropertyChangeEvent
ePropertyChangeListener
dojava.beans
pacote.fonte
PropertyChangeListener
substituiObserver
, mas o que devo estender / implementar no lugar deObservable
?PropertyChangeSupport
variável de instância, mas eu gostaria de receber uma confirmação.Resp: A
Observable
classe e aObserver
interface foram descontinuadas no Java 9 porque o modelo de evento suportadoObserver
eObservable
é bastante limitado, a ordem das notificações entregues peloObservable
não é especificada e as alterações de estado não estão em correspondência um por um com as notificações.Consulte o documento Java https://docs.oracle.com/javase/9/docs/api/java/util/Observable.html
Existem muitas alternativas do padrão de design do Observer e o Reactive Streams é uma delas.
Fluxos reativos ou API de fluxo :
Flow
é uma classe introduzida no Java 9 e tem 4 interfaces inter-relacionados:Processor
,Publisher
,Subscriber
eSubscription
.Flow.Processor
: Um componente que atua como Assinante e Publicador.Flow.Publisher
: Um produtor de itens recebidos pelos Assinantes.Flow.Subscriber
: Um receptor de mensagens.Flow.Subscription
: Controle de mensagem vinculando aFlow.Publisher
eFlow.Subscriber
.Consulte o documento Java https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/Flow.html
fonte
Considerando que a
Observable
classe e aObserver
interface foram descontinuadas a partir do Java 9. De acordo com o post Observador e Observável do Java Desaprovado no JDK 9fonte