繁体   English   中英

如何扩展匿名内部类中某些变量的范围

[英]how to extend scope of some variable in anonymous inner 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的范围扩展到其外部块。

我尝试过,但是没有成功。 在外部块中声明最终变量将不起作用,因为我们无法在内部再次对其进行初始化。

问题:这不是那么容易。 您会看到,匿名内部类的想法是它可能与其外部上下文“分离”。 这就是为什么在内部使用局部变量时必须使它们成为最终变量的原因。

解决该问题的“正常”方法:将字段添加到封闭的类中,例如:

public class YourClass ... {
  private Uri downloadUri;

现在您的内部类可以读取并修改该字段downloadUri

O,正如Ayushin所建议的那样:您还可以调用封闭类的方法,并提供该本地创建的Uri对象作为参数。 最后,“什么是对的”在很大程度上取决于您的总体背景/设计。

在这里,我建议使用“ Holder”类,该类将有助于存储值。 这是一种非常有用的机制,可让您访问数据。 就我个人而言,我认为拥有公共范围的变量不是一个好主意

因此,您可以拥有一个具有getters / setter的holder类型对象:

public class HoldThis {

    private Uri downloadUri;

    public void setUri(Uri uri){
        this.downloadUri = uri;
    }

    public Uri getUri(){
        return downloadUri;
    }

}

您还可以选择执行以下操作:

外部类: final Uri []uri = new Uri[1]; 然后您可以通过执行uri[0] = taskSnapshot.getDownloadUrl();在内部类中对其进行修改uri[0] = taskSnapshot.getDownloadUrl();

您可以添加一个成员字段,在该成员字段上设置downloadUri的值。 您无法在保存上述代码的方法中进行设置,因为一旦该方法完成,该堆栈帧就会从内存中删除。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM