【问题标题】:How to pass information to an anonymous class in java ?如何将信息传递给java中的匿名类?
【发布时间】:2015-01-26 04:51:57
【问题描述】:

我有以下代码:

@Override
public void onReceive(Context arg0, Intent arg1) 
{
    String blabla = "blabla";
    Handler connectionStatusHandler = new Handler() 
    {
        @Override
        public void handleMessage(Message msg) 
        {
            //Do something with blabla;
        }

    };
}

不幸的是,由于 java 处理闭包的方式,它不起作用,我无法使 blabla final。

所以我想也许我可以做这样的事情

@Override
public void onReceive(Context arg0, Intent arg1) 
{
    String blabla = "blabla";
    Handler connectionStatusHandler = new Handler() 
    {
        @Override
        public void handleMessage(Message msg) 
        {
            //Do something with localBlabla;
        }

        public String localBlabla;
    };

    connectionStatusHandler.localBlabla = blabla;
}

但它也不起作用,因为 Handler 没有名为 localBlabla 的成员。

从技术上讲,我可以创建一个从 Handler 继承的非匿名类并在那里添加我想要的成员,但在我这样做之前,我想知道也许有人有一些技巧来解决它并将非最终数据传递给内部类

谢谢

【问题讨论】:

  • 为什么你不能将blabla 定为最终版本?我看不出有任何理由不将final 添加到声明中。
  • 我希望他能够引用变量,也许当处理程序将被调用时 blabla 会将他的值更改为其他值。
  • 您仍然可以将blabla 的当前值复制到最终变量中。

标签: java android


【解决方案1】:

一个快速而肮脏的技巧是使用只有一个值的final String[]。这样,值仍然是可变的,但您可以在任何需要 final 的地方使用它:

@Override
public void onReceive(Context arg0, Intent arg1) 
{
    final String[] blabla = new String[] { "blabla" };
    Handler connectionStatusHandler = new Handler() 
    {
        @Override
        public void handleMessage(Message msg) 
        {
            blabla[0] = "new string value";
        }

    };
    blabla[0] = "i'm still editable";
}

这最初是由想要一个包装类的人想到的,类似于Reference 或 c++ 指针,但懒得写出完整的接口。

我建议不要在您打算可维护的任何代码中使用它。如果您编写更多样板文件,您可以提出更清晰、更清晰的选项。

【讨论】:

    【解决方案2】:

    您可以创建一个新类,将其命名为MyConnectionStatusHandler 之类的名称,并为其创建一个公共构造函数来获取消息并存储它。然后使用new MyConnectionStatusHandler(blabla) 而不是new Handler(){...}。

    编辑: 我以前尝试过这样做,但它要么不起作用,要么变得一团糟。创建一个非匿名类可能是您的最佳选择。

    【讨论】:

      猜你喜欢
      • 2011-07-03
      • 1970-01-01
      • 2013-10-19
      • 2011-11-20
      • 1970-01-01
      • 2017-04-02
      • 1970-01-01
      • 2015-10-09
      • 1970-01-01
      相关资源
      最近更新 更多