24

我有以下内容:

Runnable done = new Runnable()
    {
        public void run()
        {
            System.out.println("Hello");
        }
    };

然后在我的 Android 活动中,我将调用类似:

runOnUIThread(done);

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

(这实际上是一个 android 问题,但将其简化为基本 Java,因此更容易回答)

谢谢

4

2 回答 2

48

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

但它有两个缺点:

  • 变量“你好”必须是最终的,

  • 匿名类具有对外部类实例的内部引用——这意味着当外部类有资格进行垃圾收集时,它会被保留。@See:Effective Java [Joshua Bloch],第 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); 
  }
...
}
于 2010-11-28T15:54:59.593 回答
22
final String hello = whereverItsComingFrom;
Runnable done = new Runnable()
    {
        public void run()
        {
            System.out.println(hello);
        }
    };
于 2010-11-28T14:38:58.270 回答