如何在匿名内部 class 中扩展某些变量的范围
how to extend scope of some variable in anonymous inner class
我有一个匿名 class :
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();
}
});
我想将 downloadUri 的范围扩展到它的外部块。
我试过了,但没成功。
在外部块中声明一个 final 变量将不起作用,因为我们无法在内部再次对其进行初始化。
您可以添加一个成员字段,您可以在其中设置 downloadUri 的值。您不能在包含上述代码的方法中设置它,因为一旦该方法完成,该堆栈帧将从内存中删除。
问题:没那么容易。你看,匿名内部 class 的想法是它可能是来自其外部上下文的 "decoupled"。这就是为什么在内部使用局部变量时必须将它们设为 final 的原因。
"normal" 解决方法:将 字段 添加到封闭的 class,如:
public class YourClass ... {
private Uri downloadUri;
现在您的内部 class 可以读取和修改该字段 downloadUri。
O,正如 Ayushin 所建议的:您也可以调用封闭 class 的方法,并提供本地创建的 Uri 对象作为参数。最后,"whats right"很大程度上取决于你的整体context/design。
在这里,我建议使用有助于存储值的 "Holder" class。这是一个非常有用的机制,允许您访问数据。就个人而言,我 don't think that having public scoped variables are a good idea.
所以你可以有一个持有人类型的对象 getters/setters 来持有 :
public class HoldThis {
private Uri downloadUri;
public void setUri(Uri uri){
this.downloadUri = uri;
}
public Uri getUri(){
return downloadUri;
}
}
您还可以选择执行以下操作:
外部 class: final Uri []uri = new Uri[1];
然后你可以在内部 class 中修改这个 uri[0] = taskSnapshot.getDownloadUrl();
我有一个匿名 class :
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();
}
});
我想将 downloadUri 的范围扩展到它的外部块。
我试过了,但没成功。 在外部块中声明一个 final 变量将不起作用,因为我们无法在内部再次对其进行初始化。
您可以添加一个成员字段,您可以在其中设置 downloadUri 的值。您不能在包含上述代码的方法中设置它,因为一旦该方法完成,该堆栈帧将从内存中删除。
问题:没那么容易。你看,匿名内部 class 的想法是它可能是来自其外部上下文的 "decoupled"。这就是为什么在内部使用局部变量时必须将它们设为 final 的原因。
"normal" 解决方法:将 字段 添加到封闭的 class,如:
public class YourClass ... {
private Uri downloadUri;
现在您的内部 class 可以读取和修改该字段 downloadUri。
O,正如 Ayushin 所建议的:您也可以调用封闭 class 的方法,并提供本地创建的 Uri 对象作为参数。最后,"whats right"很大程度上取决于你的整体context/design。
在这里,我建议使用有助于存储值的 "Holder" class。这是一个非常有用的机制,允许您访问数据。就个人而言,我 don't think that having public scoped variables are a good idea.
所以你可以有一个持有人类型的对象 getters/setters 来持有 :
public class HoldThis {
private Uri downloadUri;
public void setUri(Uri uri){
this.downloadUri = uri;
}
public Uri getUri(){
return downloadUri;
}
}
您还可以选择执行以下操作:
外部 class: final Uri []uri = new Uri[1];
然后你可以在内部 class 中修改这个 uri[0] = taskSnapshot.getDownloadUrl();