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

2022-09-01 19:49:49

我有以下几点:

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

然后在我的Android活动中,我会调用如下名称:

runOnUIThread(done);

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

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

谢谢


答案 1

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

但它有2个缺点:

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

  • 匿名类具有对外部类实例的内部引用 - 这意味着当外部类符合垃圾回收的条件时,将保留外部类。@See:有效的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); 
  }
...
}

答案 2
final String hello = whereverItsComingFrom;
Runnable done = new Runnable()
    {
        public void run()
        {
            System.out.println(hello);
        }
    };

推荐