请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

注册监听器逸出的问题

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并可随意修改嘛?

正在回答 回答被采纳积分+3

2回答

提问者 等待灬 2019-11-22 02:06:18
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 回复 有任何疑惑可以回复我~
  • 提问者 等待灬 #1
    除非保证MultiThreadsError5初始化时没有其他复杂的业务逻辑,只有count赋值,这样还可以
    回复 有任何疑惑可以回复我~ 2019-11-22 02:08:10
  • 悟空 回复 提问者 等待灬 #2
    可以用后面小节讲的工厂模式保证初始化完毕再发布
    回复 有任何疑惑可以回复我~ 2019-11-22 02:15:08
  • 提问者 等待灬 回复 悟空 #3
    嗯,知道后面有这个解决办法,还没看到,其实解决办法并不是唯一的哈
    回复 有任何疑惑可以回复我~ 2019-11-22 02:18:07
悟空 2019-11-22 01:41:06

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

0 回复 有任何疑惑可以回复我~
  • 提问者 等待灬 #1
    呀,老师还没睡啊
    噢,是这样啊,那把count赋值的动作放在注册监听器之前不是就可以了嘛  (((φ(◎ロ◎;)φ)))
    回复 有任何疑惑可以回复我~ 2019-11-22 01:55:11
  • 提问者 等待灬 #2
    试了一下好像不对,必须先注册监听,当触发事件时才会执行打印count的操作
    回复 有任何疑惑可以回复我~ 2019-11-22 01:57:58
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号