【问题标题】:How the observer is added in the constructor?构造函数中如何添加观察者?
【发布时间】:2020-07-15 23:17:37
【问题描述】:
public static void main(String[] args) {
        WeatherData subject =new WeatherData();
        new ShowEstadistics(subject);
} 


public class WeatherData implements Subject {

    ArrayList<Observer> observers;

    public WeatherData() {
        observers = new ArrayList();
    }

    @Override
    public void registerObserver(Observer o) {
        observers.add(o);
    }
}



public class ShowEstadistics implements Observer{

WeatherData weatherdata;

public ShowEstadistics(WeatherData subject) {
     this.weatherdata=subject;

     this.weatherdata.registerObserver(this);
        
    }

我不知道观察者是如何在这部分的主题中注册的:

public ShowEstadistics(WeatherData subject) {
         this.weatherdata=subject;
    
         this.weatherdata.registerObserver(this);
            
        } 

因为我将 registerObserver 方法应用于天气数据,但由于某种原因,它也在主题中注册。我不知道为什么。

请有人解释一下。

【问题讨论】:

标签: java object design-patterns observer-pattern


【解决方案1】:

假设你有这样的代码场景:

Integer x=new Integer(4);
Integer y=new Integer(5);
y=x;
x=new Integer(2);

在这种情况下,您认为 y 的值是多少?它是一个包含 5 的整数对象吗? 答案是Integer Object Containing 2

当我们说Integer x=new Integer(4) 时,我们的意思是 x 指向内存中的地址,该地址具有包含值 4 的对象。类似地,对于 y,y 指向内存中的地址,该地址具有包含值为 5。 然后写y=x 表示我们删除了具有包含 5 的对象的地址处的指针,并将其指向 x 指向的当前值为 5 的对象。包含 5 的对象的地址不再有任何变量指向它,并且因此,您不能调用或修改它的值。在用x=new Integer(2)将x和y指向的地址对象更改为值为2的对象后,调用这些变量中的任何一个都将返回相同的对象(因为它们具有相同的引用)。

现在这是一个基于Integer 对象类型的基本示例,但可以应用于任何更复杂的对象。

【讨论】:

  • 不幸的是,您选择了一种原始数据类型来演示引用类型的行为。因此,您的示例是完全错误的; y 的值是not 2
  • 你是对的。这是一个灾难性的错误。我忘记了原始类型的行为不同。我编辑了答案,谢谢。
  • 不幸的是,您选择Integer 进行演示,这里是按值传递。因此,您的示例仍然是完全错误的,因为 y 的值是 4。您也使用了已弃用的构造函数。
猜你喜欢
  • 2019-05-12
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
  • 2012-01-21
  • 1970-01-01
  • 1970-01-01
  • 2013-03-08
  • 1970-01-01
相关资源
最近更新 更多