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

时间:2016-09-05 08:57:17

标签: java final

我是一个匿名班:

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的范围扩展到其外部块。

我试过了,但我没有这样做。 在外部块中声明最终变量将不起作用,因为我们无法在内部对其进行初始化。

3 个答案:

答案 0 :(得分:1)

问题:这并不容易。你看,一个匿名内部类的想法是它可能会解耦&#34;从它的外在背景。这就是为什么在内部使用它们时必须使局部变量 final 的原因。

&#34;正常&#34;解决这个问题的方法:在封闭类中添加字段,例如:

public class YourClass ... {
  private Uri downloadUri;

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

O,正如Ayushin建议的那样:您也可以调用封闭类的方法,并将本地创建的Uri对象作为参数提供。最后,&#34;什么是正确的&#34;在很大程度上取决于您的整体背景/设计。

答案 1 :(得分:1)

在这里,我建议使用“Holder”类来帮助存储值。这是一种非常有用的机制,允许您访问数据。我个人don't think that having public scoped variables are a good idea

所以你可以拥有一个持有者类型对象,其中包含getter / setter:

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();

在内部类中修改它

答案 2 :(得分:0)

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

相关问题