Java 为什么不是';接收到的数据是否正确?

Java 为什么不是';接收到的数据是否正确?,java,observer-pattern,Java,Observer Pattern,我编写了一个程序来学习和使用观察者模式,但在正确打印数据时遇到了问题。它应该打印出在粘贴中第7-9行输入的数据,但它只打印0,0,0 主类 public class ObserverPattern { public static void main(String[] args) { Subject weatherData = new Subject(); weatherData.setTemp(81); weatherData.setHu

我编写了一个程序来学习和使用观察者模式,但在正确打印数据时遇到了问题。它应该打印出在粘贴中第7-9行输入的数据,但它只打印0,0,0

主类

public class ObserverPattern {

    public static void main(String[] args) {
        Subject weatherData = new Subject();
        weatherData.setTemp(81);
        weatherData.setHumidity(14);
        weatherData.setWindSpeed(8);

        Observer johnsIpad = new Observer(weatherData);

        weatherData.notifyObserver();

        System.out.println(johnsIpad.toString());
    }

}
学科类别

import java.util.ArrayList;

public class Subject {

    // fields
    ArrayList<Observer> observers;
    public double temp;
    public double humidity;
    public double windSpeed;

    // Constructor
    public Subject() {
        observers = new ArrayList<Observer>();
    }

    // Observer pattern methods
    public void register(Observer o) {
        observers.add(o);
    }

    public void unregister(Observer o) {
        observers.remove(observers.indexOf(o));
    }

    public void notifyObserver() {
        for (Observer observer : observers) {
            observer.update(temp, humidity, windSpeed);
        }
    }

    // set weather data
    public void setTemp(double temp) {
        this.temp = temp;
    }

    public void setHumidity(double humidity) {
        this.humidity = humidity;
    }

    public void setWindSpeed(double windSpeed) {
        this.windSpeed = windSpeed;
    }

}

您从未向受试者注册您的观察者,因此
notifyObserver
没有要通知的观察者;for循环体从不执行

加:


在调用
notifyObserver(weatherData)
之前,您从未向受试者注册您的观察者,因此
notifyObserver
没有要通知的观察者;for循环体从不执行

加:


在调用notifyObserver(weatherData)之前,我在Observer类的构造函数中添加了这一行

weatherData.register(this);

现在它起作用了。感谢您向我指出这一点。

我在Observer类的构造函数中添加了这一行

weatherData.register(this);

现在它起作用了。谢谢你向我指出这一点。

你说得对。我将其添加到构造函数中。作为旁注,无论是以您的方式还是在构造函数中进行,都会产生不同的结果,在构造函数中,这意味着每次都会自动发生,这可能是不可取的。但是,如果它不在构造函数中,并且您不希望每次都使用它,那么很容易忘记注册它。这可能取决于您希望它注册的频率。否。不要将其添加到构造函数中。我在上面评论了几个原因,说明这是个坏主意。(当我说“上面”时,我指的是)。你是对的。我将其添加到构造函数中。作为旁注,无论是以您的方式还是在构造函数中进行,都会产生不同的结果,在构造函数中,这意味着每次都会自动发生,这可能是不可取的。但是,如果它不在构造函数中,并且您不希望每次都使用它,那么很容易忘记注册它。这可能取决于您希望它注册的频率。否。不要将其添加到构造函数中。我在上面评论了这是一个坏主意的几个原因。(当我说“上面”时,我指的是)。请注意,您并不真的希望类中的
主题
引用:它创建了一个循环引用(这可能会影响垃圾收集),并且您从未实际使用过它。最好通过将
观察者
注册到
主题
外部,而不是在构造函数中,来最小化
观察者
类的责任。此外,这是一个被称为不安全发布的示例:在
观察者
完全构建之前,您正在共享对它的引用。这通常会导致相当不可预测的结果,尤其是在线程安全方面。嗯,这一点很好。我就是这样做的,因为derek banas在我观看的教程中就是这样做的。请注意,您并不真正希望类中包含
主题
引用:它创建了一个循环引用(可能会影响垃圾收集),而您从未实际使用过它。最好通过将
观察者
注册到
主题
外部,而不是在构造函数中,来最小化
观察者
类的责任。此外,这是一个被称为不安全发布的示例:在
观察者
完全构建之前,您正在共享对它的引用。这通常会导致相当不可预测的结果,尤其是在线程安全方面。嗯,这一点很好。我就是这么做的,因为德里克·巴纳斯(derek banas)在我观看的教程中就是这么做的。
weatherData.register(this);