2011-01-22 118 views
3

我是新來的java,我仍然試圖理解語言,所以如果這個問題聽起來不太好,我很抱歉。瞭解java中的事件監聽器

有件事情我不理解的聽衆,有時你可以看到這樣的方式聲明的聽衆:

private View.OnClickListener onSave=new View.OnClickListener() { 
public void onClick(View v) { 

// Some code 

} 

}; 

或:

javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 

的一件事情困擾我最多的是該方法結束後的分號和括號。

我瞭解內部類爲了有多個監聽器的目的,但我不明白這個變量和方法的混合聲明。

它的目的是什麼?

它是如何聲明的?

WTF? :P

歡呼:)

+1

與[在Java中如何使用匿名(內部)類)類似? ](http://stackoverflow.com/questions/355167/how-are-anonymous-inner-classes-used-in-java)。 – 2011-01-22 16:54:55

回答

3

通常定義一個類,實例化一個實例,然後使用該實例分別完成:

class MyListener extends OnClickListener { 
    public void onClick(View v) { 
     // my onClick code goes here 
    } 
} 

MyListener foo = new MyListener(); 

button.setOnClickListener(foo); 

但有時你需要一個子類,你將只有一次立即實例化,這是常有的事爲事件處理程序。爲方便起見,定義它和它一起使用匿名(內)類實例:

OnClickListener foo = 
    new OnClickListener() { 
     public void onClick(View v) { 
      // my onClick code goes here 
     } 
    }; 

button.setOnClickListener(foo); 

但由於foo只使用一次,我們可以藉此一步,消除局部變量foo一樣,所以:

button.setOnClickListener(foo); 

可以格式化爲:在foo

button.setOnClickListener(
    foo 
); 

替代:

button.setOnClickListener(
    new OnClickListener() { 
     public void onClick(View v) { 
      // my onClick code goes here 
     } 
    } 
); 
重新格式化沒有一些很大的空白看到它

,因爲它往往是寫:

button.setOnClickListener(new OnClickListener() { 
    public void onClick(View v) { 
     // my onClick code goes here 
    } 
}); 

我想,這最後一種格式傷害可讀性。我對我的匿名類進行格式化,類似於下一個格式 - 更好的可讀性(恕我直言)值得一點額外的空白。

1

這是一個anonymous inner class。這是一個非常常見和方便的構造。閱讀我鏈接到的教程!

2

打破它......

javax.swing.SwingUtilities.invokeLater(Runnable runnable); 

invokeLater()SwingUtilities一個靜態方法,它接受Runnable作爲參數。

注意最後的右括號和分號;這只是一個標準方法,對吧?

中間的東西只是創建一個Runnable的新實例傳遞給方法。你承認它更好,如果我分配到一個參考:

Runnable parameter = new Runnable() 
{ 
    public void run() 
    { 
     createAndShowGUI(); 
     } 
    } 
}; 
+0

您在內部課程結束時忘了分號,但其他答案很好! – 2011-01-22 16:54:28

+0

糟糕,糾正。 – duffymo 2011-01-22 16:58:28

1

該代碼適用匿名類。搜索並閱讀此主題。

分號分別終止賦值和方法調用。

PS。我一直認爲這個名字是誤導性的,因爲你真正得到的是一個對象。

1

我會嘗試舉例說明第二個例子。

在這種情況下的invokeLater方法期望任何物體器具Runnable接口。

例如,這是寫一樣的東西沒有一個匿名類的另一種方式:

class Example implements Runnable{ 
    public void run(){ 
    // do something 
    } 
} 

和你的例子是:

javax.swing.SwingUtilities.invokeLater(new Example()); 

但由於本例中類很可能你只會使用一次,使用匿名類更方便。

2

這裏沒有什麼令人費解的分號或括號。基本上,這是一種在Java中分配匿名類的方法。如果你不習慣這種結構,你也可以創建自己的類實現Runnable接口,併爲其分配是這樣的: -

public class YourRunnableClass implements Runnable { 
    public void run() { 
     ... 
    } 
} 

然後你可以讓它看起來更好,就像這樣: -

javax.swing.SwingUtilities.invokeLater(new YourRunnableClass()); 

P/S:儘量不要在您的文章中使用「WTF」。 :)