如何将变量传递给新的Runnable声明?

Jim*_*mmy 23 java android runnable android-2.1-eclair

我有以下内容:

Runnable done = new Runnable()
    {
        public void run()
        {
            System.out.println("Hello");
        }
    };
Run Code Online (Sandbox Code Playgroud)

然后在我的Android活动中,我会称之为:

runOnUIThread(done);
Run Code Online (Sandbox Code Playgroud)

然后我打电话给你.但是,我希望"Hello"不要硬编码,所以我可以传入它.否则我将必须为我想要打印的每个字符串都有一个这样的声明.

(这实际上是一个android问题,但是它缩小到基本Java,所以更容易回答)

谢谢

Ral*_*lph 48

在Java中(我相信它在Android中也是如此),你可以使用一个匿名的内部类,就像Bart van Heukelom所建议的那样.此解决方案的优点是必须编写更少的代码,并且可以访问外部类的字段和方法.

但它有两个缺点:

  • 变量"hello"必须是final,

  • 匿名类具有对外部类实例的内部引用 - 这意味着外部类在有资格进行垃圾回收时保留.@See:Effective Java [Joshua Bloch],Item 22:赞成非静态的静态成员类

在我看来,以这种方式参数化类实例是不好的做法.

所以我相信,只要您不需要访问外部类的方法和字段,最好为此任务编写特定的类并使其成为静态成员类.

class Demo {
...

  private static class MyRunnable implements Runnable {
     private final String message;

     MyRunnable(final String message) {
       this.message = message;
     }

     public void run() {
       System.out.println(message);
     }
  }

  public void startThread() {
    MyRunnable myRunnable = new MyRunnable("Hello");

    runOnUIThread(myRunnable); 
  }
...
}
Run Code Online (Sandbox Code Playgroud)


Bar*_*lom 22

final String hello = whereverItsComingFrom;
Runnable done = new Runnable()
    {
        public void run()
        {
            System.out.println(hello);
        }
    };
Run Code Online (Sandbox Code Playgroud)

  • @gtoknu然后只做参数e final (3认同)