Observer 和 Observable 已被弃用,原因是:它们传达了某些内容已更改,但未说明已更改的内容,这是错误的吗?

N-R*_*YAN 1 java observer-pattern java-8 java-9

通过打开jdk检查一下

弃用 Observer 和 Observable

观察者和可观察类:

可观察到:-

class NewsAgency extends Observable {

String news;
public void setNews(String news) {
    this.news = news;
    setChanged();
    notifyObservers(news);
 }
}
Run Code Online (Sandbox Code Playgroud)

观察员:-

public class IndiaNews implements Observer {
   @Override
   public void update(Observable o, Object news) {
   System.out.println("Indianews: " +news.toString());
 }
}

class AjjTak implements Observer {
@Override
public void update(Observable o, Object news) {
    System.out.println("AjjTak: " +news.toString());
}
Run Code Online (Sandbox Code Playgroud)

主要类别:-

public class Main {
public static void main(String[] args) {
    NewsAgency newsAgency = new NewsAgency();

    IndiaNews indiaNews = new IndiaNews();
    AjjTak ajjTak = new AjjTak();

    newsAgency.addObserver(indiaNews);
    newsAgency.addObserver(ajjTak);

    newsAgency.setNews("Yo");
}
Run Code Online (Sandbox Code Playgroud)

}

但我能够告诉观察者新闻已经改变了 ,那么上述说法是真实的吗?

有人能澄清我的想法吗?

谢谢 :)

Ste*_*n C 7

但我能够告诉观察者,新闻已经改变了。上述说法何以属实?

问题跟踪器链接中的文本显示:

“例如,他们只支持某些事情已经发生变化的观念,但他们没有传达任何有关发生变化的信息。”

在您的示例中,update方法调用告诉观察者某些内容发生了变化,但没有告诉观察者实际发生了什么变化。因此,当您调用 时setNews("Yo")indiaNews观察者会被告知情况newsAgency已发生变化。但没有告知变化是什么。观察者可以使用news参数来查看 的当前状态newsAgency,但无法查看更改之前的状态,或者更改之后的状态1

Observer在/的许多用例中Observable,应用程序需要知道实际发生了什么变化才能触发update

这是被强调的缺陷,也是弃用的原因之一javadoc中的弃用文本还列出了其他文本:

“该类和Observer接口已被弃用。其支持的事件模型Observer相当Observable有限,通知下发的顺序Observable未指定,并且状态变化与通知不是一一对应的。对于更丰富的事件模型,考虑使用该java.beans包。为了在线程之间实现可靠且有序的消息传递,请考虑使用包中的并发数据结构之一java.util.concurrent。对于反应式流样式编程,请参阅FlowAPI。”


1 - 由于未指定通知传递的顺序,因此在调用发生时观察到的对象的状态可能已再次update更改。