构建 Observer 和 Observable class
Building Oberver and Observable class
我没有使用内置 class Observable and Observer 我正在尝试自己构建它。
我从文档中得出:
public class Observable{
private Set<Observer> observingMe=null;
private boolean amIchanged;
public void notifyObservers(Object args){
for(Observer o:observingMe){
o.update(args);
}
}
public void addObserver(Observer e){
observingMe.add(e);
}
}
public class Price implements Observable{
private int price;
public void setPrice(int newPrice){
price=newPrice;
notifyObservers(price);
}
}
public interface Observer{
public void update(Object args);
}
这是(简而言之)Observable 的正确实现吗?在构建 Observable class 时我还需要考虑什么?
有没有办法自动检测 Observable 实例中的任何变化或继承的 class 必须显式调用 notifyObservers?
请不要介意语法或小错误
在你的通知方法中,考虑观察者在调用更新时抛出异常的情况。如果您不处理它,它将阻止其他观察者收到通知。此外,您可能希望在单独的线程中通知每个观察者,因为其中一个观察者可能需要很长时间才能对事件做出反应,从而防止其他人提前得到通知。
此外,您从不使用布尔值 amIChangeed,并且在没有 getter 的情况下将其保密。否则,你已经实现了基本原则。
一开始有几点不对:
observingMe
使用时会抛出 NullPointerException,因为它没有被初始化。
- 您不能将
implements
与 class
一起使用。你应该使用 extends
因为 Observable
是 class.
amIchanged
从未使用过。你可以删除它。
关于自动观察者通知:您可能希望在建议后连接一个 AOP,在每次 set...(...)
方法调用后触发。 (检查确切的切入点语法)。
但这值得吗?为确保方法 notifyObservers()
被调用,您可能更喜欢几个测试方法。
您也可以考虑使用 removeObserver(Observer e)
方法。
我没有使用内置 class Observable and Observer 我正在尝试自己构建它。
我从文档中得出:
public class Observable{
private Set<Observer> observingMe=null;
private boolean amIchanged;
public void notifyObservers(Object args){
for(Observer o:observingMe){
o.update(args);
}
}
public void addObserver(Observer e){
observingMe.add(e);
}
}
public class Price implements Observable{
private int price;
public void setPrice(int newPrice){
price=newPrice;
notifyObservers(price);
}
}
public interface Observer{
public void update(Object args);
}
这是(简而言之)Observable 的正确实现吗?在构建 Observable class 时我还需要考虑什么? 有没有办法自动检测 Observable 实例中的任何变化或继承的 class 必须显式调用 notifyObservers?
请不要介意语法或小错误
在你的通知方法中,考虑观察者在调用更新时抛出异常的情况。如果您不处理它,它将阻止其他观察者收到通知。此外,您可能希望在单独的线程中通知每个观察者,因为其中一个观察者可能需要很长时间才能对事件做出反应,从而防止其他人提前得到通知。
此外,您从不使用布尔值 amIChangeed,并且在没有 getter 的情况下将其保密。否则,你已经实现了基本原则。
一开始有几点不对:
observingMe
使用时会抛出 NullPointerException,因为它没有被初始化。- 您不能将
implements
与class
一起使用。你应该使用extends
因为Observable
是 class. amIchanged
从未使用过。你可以删除它。
关于自动观察者通知:您可能希望在建议后连接一个 AOP,在每次 set...(...)
方法调用后触发。 (检查确切的切入点语法)。
但这值得吗?为确保方法 notifyObservers()
被调用,您可能更喜欢几个测试方法。
您也可以考虑使用 removeObserver(Observer e)
方法。