java - 最终局部变量可能尚未在匿名内部类中初始化

标签 java callback anonymous-types final

这是我的代码:

final Foo myFoo = new Foo(new Inner() {
    @Override
    callback(){
         myFoo.bar();
    }
});

(带有实际的函数名)

final MyArrayAdapter aa = new MyArrayAdapter(new View.OnClickListener() {
    @Override
    onClick(){
         aa.notifyDataSetChanged();
    }
});

Java 给我一个关于 myFoo 可能没有被初始化的错误。有没有什么办法解决这一问题?我可以在构造对象时将回调设置为 null,然后再更改它,但我希望有一种更简洁的方法。有任何想法吗? (如果 Foo 不是我写的并且没有公开接口(interface)来稍后更改回调,那也是行不通的)

如果有人好奇,在我的具体场景中,Foo 是一个 ArrayAdapter,bar 是 notifyDataSetChanged()。适配器显示的内容取决于数组中项目的值,这些值在单击时会发生变化。回调是 clickListener。

最佳答案

简短的回答是,您在 Java 中肯定不能这样做,但编译器已经告诉您了。您试图同时创建两个相互引用的对象,这是先有鸡还是先有蛋的问题。底线是,您必须先创建其中一个。

一个建议是一个两步创建:

....
final MyArrayAdapter aa = new MyArrayAdapter();
aa.initializeButtonClickListener();
....

然后将“初始化”方法添加到适配器。

public void initializeButtonClickListener(){
    this.button.setOnClickListener(new View.OnClickListener() {
        @Override
        onClick(){
             notifyDataSetChanged();
        }
    });
}

因为构造有些复杂(即,比简单地调用构造函数更复杂),我建议将这两行拉入 MyArrayAdapter 工厂方法,并将构造函数设为私有(private)。

关于java - 最终局部变量可能尚未在匿名内部类中初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10239046/

相关文章:

java - 找到两个数组中最大的数字

Java 序列化 - java.io.InvalidClassException 本地类不兼容

Java简单回调

Javascript 在回调函数中打破 for 循环

c# - 使用 GetHashCode 比较相同的匿名类型是否安全?

java - 基于 Java 的 Web 应用程序的 Windows 身份验证,如何?

java - 解决了无论如何要在不创建另一个扫描仪的方法中执行此操作吗?

inheritance - 在 Objective-C++ 应用程序中接收 C++ 虚拟方法调用的正确方法是什么?

c# - 有没有办法指定一个匿名的空可枚举类型?

C# 功能请求 : implement interfaces on anonymous types