java – 注册监听器的正确位置在哪里

前端之家收集整理的这篇文章主要介绍了java – 注册监听器的正确位置在哪里前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我正在开发一个集中使用观察者模式的项目.
许多类用作事件/消息侦听器.
通常,监听类在构造函数注册自己,我看到了两个问题:

>我们正在构造函数中工作
>该类依赖于观察到的类,即使它只对事件本身感兴趣.

注册是否应由听力课负责,还是应该在其他地方?

最佳答案
从构造函数订阅可能会导致继承问题.假设我们的代码看起来像这样:

public class Parent {
    public Parent(EventObject source) {
        // initialize parent ...
        source.subscribe(this::someMethod);
    }
    public void someMethod() {
        ...
    }
...
}

public class Child extends Parent {
    public Child(EventObject source) {
        super(source);
        // initialize child ...
    }
...
}

Child ctor调用Parent ctor,它将自己注册到事件源.但请注意,在注册Parent时,未对Child对象进行初始化.如果事件源在Child ctor完成之前更新,则您的代码可能表现得非常奇怪.

避免此问题的一种简单方法是在工厂方法中进行订阅,从而隐藏ctors.

public class Parent {
    public static Parent newInstance(EventObject source) {
        Parent p = new Parent();
        source.subscribe(p::someMethod);
        return p;
    }        
    protected Parent() {
        // initialize parent ...
    }
    public void someMethod() {
        ...
    }
...
}

public class Child extends Parent {
    public static Child newInstance(EventObject source) {
        Child c = new Child();
        source.subscribe(c::someMethod);
        return c;
    }    
    protected Child() {
        super();
        // initialize child ...
    }
...
}
原文链接:https://www.f2er.com/java/437291.html

猜你在找的Java相关文章