考虑以下声明:
public final class MyClass {
public MyClass(AnotherClass var) {
/* implementation not shown */
}
public void invoke() {
/* implementation not shown */
}
/* there may be more methods/properties listed */
}
public class AnotherClass() {
public AnotherClass() {
/* implementation not shown */
}
public void method() {
/* implementation not shown */
}
/* there may be more methods/properties listed */
}
这两个类的实现可能不会改变。
现在考虑以下代码:
final MyClass myVariable = new MyClass(anotherVariable);
AnotherClass anotherVariable = new AnotherClass() {
@Override
public void method() {
myVariable.invoke();
}
};
显然它无法运行,因为anotherVariable
在第一行没有准备就绪,但是如果我重新排列这两个语句......
AnotherClass anotherVariable = new AnotherClass() {
@Override
public void method() {
myVariable.invoke();
}
};
final MyClass myVariable = new MyClass(anotherVariable);
然后,myVariable
可能尚未初始化,但仍然无效。
我怎么能让这个工作?
真实世界的例子是(来自android):
final MediaScannerConnection msc = new MediaScannerConnection(this,
new MediaScannerConnection.MediaScannerConnectionClient() {
@Override
public void onScanCompleted(String path, Uri uri){
msc.disconnect();
}
@Override
public void onMediaScannerConnected() {
msc.scanFile("", null);
}
});
msc.connect();
答案 0 :(得分:1)
这是一种方法:
AnotherClass anotherVariable = new AnotherClass() {
private MyClass myVariable;
public void setMyVariable(MyClass myVariable) {
this.myVariable = myVariable;
}
@Override
public void method() {
this.myVariable.invoke();
}
};
MyClass myVariable = new MyClass(anotherVariable);
anotherVariable.setMyVariable(myVariable);
anotherVariable.method();
至于您的Android示例,调用scanFile
后调用connect
可能更有意义,并使用接受scanFile
回调的MediaScannerConnection.OnScanCompletedListener
方法。< / p>