请稍等 ...
×

采纳答案成功!

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

getInstance未被调用,Listener为null的问题

老师,这里有一点疑惑和误解,这个getInstance返回的是安全的Listener,但是程序中没有调用,这个对象是返回给谁呢?我运行的时候,发现这个listener一直是null值,不会执行onEvent这个方法,输出“还未初始化完毕!”。
用了您的源码依旧是这样,是不是要在构造函数里调用getInstance呢

正在回答

1回答

悟空 2019-09-20 13:37:27

返回的安全的Listener可以不使用,重点是有了getInstance方法后,我们一旦运行完getInstance函数,就代表listener已经准备完毕了,可以正常处理事件了,所以主函数可以这样写:

public static void main(String[] args) {
    MySource mySource = new MySource();
    MultiThreadsError7 safeListener = getInstance(mySource);
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            mySource.eventCome(new MultiThreadsError5.Event() {
            });
        }
    }).start();


}


0 回复 有任何疑惑可以回复我~
  • 提问者 煮沧海 #1
    感谢!
    回复 有任何疑惑可以回复我~ 2019-09-20 14:42:52
  • 实在不知道这一节和注册监听器那一节的目的在哪里,老师你在这里这样写,那在监听器那一节也可以把创建对象写在启动线程前面,这样的运行结果也没问题啊。注册监听器那一节我的理解是,在主函数创建的线程里直接就调用了source.eventCome,而注册监听器是发生在下面的创建对象的构造函数里,而在构造函数里又有匿名内部类直接引用了类中的属性(而该属性的赋值是在注册监听器下面),导致没有初始化完成,所以count打印出来是0。但是我不懂为什么要这样写。老师也没有稍微说一说具体点儿的应用场景。在这一节,又用所谓的工厂方法把注册监听器和初始化对象分开,其实那样写,和在构造函数中,先定义监听器对象,再做该做的初始化工作,最后再把监听器注册给mySource,不是一样的吗,为什么用工厂方法呢?(而且我也不理解MultiThreadsError7这个类在业务中的作用是什么,看上去它只是注册了监听器,给count赋值,然后做一些其他的工作,这些为什么一定要在构造方法中做呢?)
    回复 有任何疑惑可以回复我~ 2020-03-30 23:20:01
  • 主要是为了演示可能导致线程问题的场景。在业务开发中,我们不需要这样写,不需要把这些放到构造函数中执行。这是错误案例演示。
    回复 有任何疑惑可以回复我~ 2020-03-31 11:02:17
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

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

帮助反馈 APP下载

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

公众号

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