【问题标题】:Anonymous inner class -- getting "this"匿名内部类——得到“this”
【发布时间】:2014-10-21 16:11:45
【问题描述】:

我知道如果我有一个匿名内部类并且我需要外部类实例,我会使用 Outer.this。但是,我在 anon 类中有一个 anon 类,我想要后者的实例(外部匿名类)。

例子:

mRestService.getComicLatest(new Callback<Comic>() {

    @Override
    public void success(Comic comic, Response response) {
    }

    @Override
    public void failure(RetrofitError retrofitError) {
        mRetryFrame.findViewById(R.id.retry_button).setOnClickListener(
                new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                mRestService.getComicLatest(WHAT_DO_I_PUT_HERE);
            }
        });
    }
});

在上面的例子中,在 WHAT_DO_I_PUT_HERE 中,我想要 Callback anon 类的实例。

显然,我知道我可以在回调类中创建一个实例变量来保存对“this”的引用并将其用于 WHAT_DO_I_PUT_HERE,但我希望可能有一种更简洁的方法,就像我们调用的方式一样Outer.this 用于非匿名类。

【问题讨论】:

  • 你为什么要这样对自己?
  • @SotiriosDelimanolis 哈哈,好吧,我猜这是一个足够好的理论问题。代码过多会看起来很糟糕,并且在大多数情况下也是糟糕的设计,但我仍然想知道这是否可能。看来我用Java这么久应该知道这些了。

标签: java this anonymous-class anonymous-inner-class


【解决方案1】:

您可以在外部匿名类中添加对this 的引用:

mRestService.getComicLatest(new Callback<Comic>() {

    private final Callback<Comic> outerAnon = this;

    @Override
    public void success(Comic comic, Response response) {
    }

    @Override
    public void failure(RetrofitError retrofitError) {
        mRetryFrame.findViewById(R.id.retry_button).setOnClickListener(
                new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                mRestService.getComicLatest(outerAnon);
            }
        });
    }
});

【讨论】:

  • 是的,这可能是最好的答案。我只是想知道是否有办法根本不命名课程。将其存储到参考变量中也可以;好点。
  • 我想不出没有最终变量的方法。有两个匿名类很复杂。祝你好运!
  • 实际上,上面第一个解决方案中的引用变量在编译时还没有初始化。这不会编译。
  • 你说得对,很好。我编辑了答案以仅反映有效的解决方案。谢谢。
【解决方案2】:

您应该能够像开始使用 Outer 一样进一步链接它。这也应该有效:

Outer.Inner.this

编辑: 进一步阅读后,我发现我可能误解了您的问题,如果是这样,对不起。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多