2010-11-28 3 views
22

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

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

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

runOnUIThread(done); 

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

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

Благодаря

ответ

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

Не самый лучший способ, потому что, если у вас есть что-то вроде этого: общественного недействительного receivedEvent (Event е) { \t queueEvent (новый Runnable() \t { \t \t общественного недействительного пробега() \t \t { \t \t \t System.out.println (e.message) \t \t} \t}); } У вас будет ошибка. – 2011-12-22 02:05:50

+3

@gtoknu тогда просто введите параметр e final – 2011-12-22 08:38:06

47

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

Но она имеет 2 недостатка:

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

  • анонимный класс имеет внутреннюю ссылку на экземпляр внешнего класса - это означает, что внешний класс сохраняются, если в противном случае он будет иметь право на сбор мусора. @see: Effective Java [Joshua Bloch], пункт 22: Favor статических классов членов над нестатическим

И по моему скромному мнению, это плохая практика, чтобы параметризует экземпляр класса таким образом.

Поэтому я считаю, что до тех пор, пока вам не нужно обращаться к методам и полям внешнего класса, лучше написать конкретный класс для этой задачи и сделать его статическим классом.

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); 
    } 
... 
}