Java接口回调中如何使用自身?未初始化报错解决方法
解决Java回调中使用自身变量的初始化问题
你碰到的这个错误,本质是局部变量还没完成初始化,就被匿名内部类提前引用了。代码里adListener的赋值和内部类定义是一步完成的,但内部类的onAdLoaded方法里已经在调用unRegisterCallback(adListener),这时候编译器没法确认adListener已经被正确赋值,所以抛出未初始化的提示。
给你三种可行的解决办法:
拆分变量声明与初始化
先单独声明变量,再给它赋值匿名内部类实例,这样编译器能确认变量后续会被赋值:AdListener adListener; adListener = new AdListener() { @Override public void onAdLoaded() { unRegisterCallback(adListener); } };改用类成员变量
如果这个回调不需要局限在当前方法内,可以把adListener改成类的成员变量,成员变量的初始化规则和局部变量不同,内部类引用时不会有未初始化问题:private AdListener adListener; // 在方法中初始化 public void initAdListener() { adListener = new AdListener() { @Override public void onAdLoaded() { unRegisterCallback(adListener); } }; }通过回调方法参数传递自身(如果接口可修改)
如果有权修改AdListener接口的定义,可以给onAdLoaded方法添加一个参数,把回调实例本身传进去,这样就不用在内部类里直接引用外部变量:// 修改后的接口 public interface AdListener { void onAdLoaded(AdListener listener); } // 使用示例 AdListener adListener = new AdListener() { @Override public void onAdLoaded(AdListener listener) { unRegisterCallback(listener); } };
内容的提问来源于stack exchange,提问作者BugMaker
相关产品推荐
相关产品推荐

