什么时候应该打电话?

时间:2012-03-10 12:34:44

标签: java middleware

// AvgTemp.java

public abstract class  AvgTemp {

// This function receives nottification from other Temperature Sensors

public AvgTemp() {

}

public void notifyReceived(String  eventName, Object arg) {
if (eventName.equals("temperatureMeasurement"))  
             { 
                onNewtemperatureMeasurement((TempStruct) arg); 
             } 
}

public abstract void onNewtemperatureMeasurement(TempStruct tempStruct);
} 

要接收通知,AvgTemp.java文件必须订阅温度传感器。这意味着我必须调用subscribetemperatureMeasurement()。

现在,我的问题是“我应该在AvgTemp.java文件中调用subscribetemperatureMeasurement(),我可以从Sensor获取通知吗?”

我应该在AvgTemp类的构造函数中还是在其他地方调用subscribetemperatureMeasurement()函数?

1 个答案:

答案 0 :(得分:2)

看起来您的问题缺少Sensor骨架,我想它看起来像这样:

public class Sensor {
    public void subscribeTemperatureMeasurement(AvgTemp avgTemp) {
        //keep avgTemp reference for later use
    }
}

你可以选择:

public AvgTemp(Sensor sensor) {
    sensor.subscribeTemperatureMeasurement(this);
}

或(外面某处):

AvtGemp avgTemp = SomeAvgTemp();
sensor.subscribeTemperatureMeasurement(avgTemp);

前一种方法有几个缺点:

  • 引入了从AvgTempSensor

  • 的不必要的耦合
  • 如果你想订阅几个传感器,你提供第一个作为构造函数参数,剩下的使用后一种方法怎么办?

  • this引用构造函数的转义,非常糟糕,在对象完全初始化之前可能会调用notifyReceived(特别是因为这是abstract类)

  • AvgTemp不能没有看似严格的Sensor,并且要求测试更加严格(需要模拟/存根)