注册监听器逸出的问题

来源:10-9 观察者模式-

等待灬

2019-11-22

public class MultiThreadsError5 {

    int count;

    public MultiThreadsError5(MySource source) {

        source.registerListener(new EventListener() {
            @Override
            public void onEvent(Event e) {
                System.out.println("\n我得到的数字是" + count);
            }
        });

        for (int i = 0; i < 10000; i++) {
            System.out.print(i+"\t");
        }
        count = 100;
    }
    }

老师,这段代码的逸出问题是体现在new EventListener()这个匿名内部类中能访问到
MultiThreadsError5类中的count并可随意修改嘛?

写回答

2回答

等待灬

提问者

2019-11-22

public MultiThreadsError5(MySource source) {

    for (int i = 0; i < 1000; i++) {
        System.out.print(i+"\t");
    }

    count = 100;

    source.registerListener(new EventListener() {
        @Override
        public void onEvent(Event e) {
            System.out.println("\n我得到的数字是" + count);
        }
    });
}

如上,如果把赋值放在注册之前,这样的话当触发事件时,for循环的操作还没执行完成,这样的话listener还是null,所以还是先注册监听器才是合理的

0
4
悟空
回复
等待灬
恩对的
2019-11-22
共4条回复

悟空

2019-11-22

这里主要是指,获取的时机不对,获取太早了。匿名内部类始终是可以访问外部属性的。

0
2
等待灬
试了一下好像不对,必须先注册监听,当触发事件时才会执行打印count的操作
2019-11-22
共2条回复

线程八大核心+Java并发原理及企业级并发解决方案

完整的并发知识网络+丰富的工作内容分享+50余道并发高频面试题

2512 学习 · 940 问题

查看课程