Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将变量传递到新的可运行声明中?_Java_Android_Runnable_Android 2.1 Eclair - Fatal编程技术网

Java 如何将变量传递到新的可运行声明中?

Java 如何将变量传递到新的可运行声明中?,java,android,runnable,android-2.1-eclair,Java,Android,Runnable,Android 2.1 Eclair,我有以下资料: Runnable done = new Runnable() { public void run() { System.out.println("Hello"); } }; 然后在我的Android活动中,我会调用类似以下内容: runOnUIThread(done); 然后我就给它打电话。但是,我希望不要硬编码“Hello”,这样我就可以传递它了。否则,对于要打印的每个字符串,我必须有一

我有以下资料:

Runnable done = new Runnable()
    {
        public void run()
        {
            System.out.println("Hello");
        }
    };
然后在我的Android活动中,我会调用类似以下内容:

runOnUIThread(done);
然后我就给它打电话。但是,我希望不要硬编码
“Hello”
,这样我就可以传递它了。否则,对于要打印的每个字符串,我必须有一个这样的声明

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

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

但它有两个缺点:

  • 变量“hello”必须是final

  • 匿名类有一个外部类实例的内部引用-这意味着外部类在符合垃圾收集条件时被保留。 @请参阅:effectiveJava[JoshuaBloch],第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); 
  }
...
}

这不是最好的方法,因为,如果您有这样的情况:public void receivedEvent(Event e){queueEvent(new Runnable(){public void run(){System.out.println(e.message)}}};}您会有一个错误。@gtoknu然后只需将参数e finalIt设置为finalIt,那么将参数设置为finalIt会有什么不同吗?请进一步解释!我考虑过重写没有final参数的方法,我应该调用另一个接收final的方法,并执行第一个方法的操作?@Gtoknu除非我错了,否则在重写或实现时可以更改参数的finality,因为它不是方法契约的一部分,只是方法体中变量的一部分。即使你不能,你也可以做
最终事件ee=e
;嗯,很高兴知道。我觉得我的C++体验让我烦恼。因为在那里,如果你发送一个函数参数的指针到另一个线程中运行的runnable,那么指向的数据可能会被破坏,访问无效内存时会出现运行时错误。是否存在多线程解决方案,其中
消息
不必是最终的?本例中的
最终
语句不是必需的。-但是,当您同时在mutlipe线程中使用Runable时,您必须处理并发性问题!
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); 
  }
...
}