Java 如何扩展匿名内部类中某个变量的作用域
我有一个匿名类:Java 如何扩展匿名内部类中某个变量的作用域,java,final,Java,Final,我有一个匿名类: filepath.putFile(userItemPhotoUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() { @Override public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { Uri downloadUri = taskSnapshot.getDownloadUrl();
filepath.putFile(userItemPhotoUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
Uri downloadUri = taskSnapshot.getDownloadUrl();
Toast.makeText(MainActivity.this, "Uploading finished ..", Toast.LENGTH_SHORT).show();
}
});
filepath.putFile(userItemPhotoUri).addOnSuccessListener(新的OnSuccessListener()){
@凌驾
成功时公共无效(UploadTask.TaskSnapshot TaskSnapshot){
Uri downloadUri=taskSnapshot.getDownloadUrl();
Toast.makeText(MainActivity.this,“上载完成…”,Toast.LENGTH_SHORT.show();
}
});
我想将downloadUri的范围扩展到它的外部块
我试过了,但没有成功。
在外部块中声明最终变量将不起作用,因为我们无法在内部再次初始化它。您可以添加一个成员字段,在该字段上设置downloadUri的值。您不能在保存上述代码的方法中设置它,因为一旦该方法完成,堆栈帧将从内存中删除。问题:这并不是那么容易。你看,匿名内部类的想法是它可能与外部上下文“解耦”。这就是为什么在内部使用局部变量时,必须将它们设置为final 解决该问题的“常规”方法是:向封闭类中添加一个字段,如:
public class YourClass ... {
private Uri downloadUri;
现在,您的内部类可以读取并修改该字段downloadUri
O、 正如Ayushin所建议的:您还可以调用封闭类的方法,并提供本地创建的Uri对象作为参数。最后,“什么是正确的”在很大程度上取决于您的总体上下文/设计。在这里,我建议使用一个“Holder”类来帮助存储值。这是一种非常有用的机制,允许您访问数据。就我个人而言,我是 因此,您可以拥有一个带有getter/setter的holder类型对象:
public class HoldThis {
private Uri downloadUri;
public void setUri(Uri uri){
this.downloadUri = uri;
}
public Uri getUri(){
return downloadUri;
}
}
您还可以选择执行以下操作:
外部类:
final Uri[]Uri=新Uri[1]然后您可以在内部类中修改它,只需执行uri[0]=taskSnapshot.getDownloadUrl()代码>您可以始终避免使用匿名内部类,并将要修改的某种对象注入到曾经是内部类的类中。调用函数并将变量作为函数的参数传递如何?第二个选项非常简单。谢谢