Как передать переменную в новую декларацию Runnable?

У меня есть следующее:

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

И затем в моей активности в Android я буду называть что-то вроде:

 runOnUIThread(done); 

Что я тогда называю. Тем не менее, я хочу, чтобы "Hello" не был жестко закодирован, поэтому я могу передать его. В противном случае мне придется иметь одно из этих объявлений для каждой строки, которую я хочу распечатать.

(Это вопрос андроида, но он сместил его на базовую Java, чтобы его легче было ответить)

благодаря

Solutions Collecting From Web of "Как передать переменную в новую декларацию Runnable?"

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

В Java (и я считаю, что это тоже на Android тоже), вы можете использовать анонимный внутренний класс, как это предложил Барт ван Хекулом. Преимущество этого решения состоит в том, что нужно писать меньше кода, и вы можете получить доступ к полям и методам внешнего класса.

Но у него есть два недостатка:

  • Переменная «привет» должна быть окончательной,

  • Анонимный класс имеет внутреннюю ссылку на экземпляр внешнего класса – это означает, что внешний класс сохраняется, если в противном случае он будет иметь право на сбор мусора. @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); } ... }