加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 01:05:34 所属栏目: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 ...
    }
...
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读