[英]Java “new” keyword in parameter
最近,我一直在研究許多OOP設計模式,並且遇到了一些以前從未見過的奇怪事情:
Button button = new Button(shell, SWT.PUSH);
button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
// Handle the selection event
System.out.println("Called!");
}
});
具體來說,這是做什么的(例如,“ new”關鍵字在這里做什么)?
button.addSelectionListener(new SelectionAdapter() {
第二個問題:
private void notifyListeners(Object object, String property, String oldValue, String newValue) {
for (PropertyChangeListener name : listener) {
name.propertyChange(new PropertyChangeEvent(this, "firstName", oldValue, newValue));
}
}
這是觀察者設計模式的摘要。 以我的新理解,name.propertyChange(...)創建一個PropertyChangeEvent對象,並通過Java的觀察者模式實現,通過將該新對象的信息發送給觀察者(或與此類似的事物)來自動通知觀察者。 它是否正確?
在這里, new
關鍵字正在創建一個匿名類。
當您需要一個偵聽器來執行某些操作,並且希望將代碼分組在一起,並且/或者該類是“一次性”時,這很有用,這意味着它在其他地方沒有用。
這是指向匿名類的sun教程的鏈接 。 所有正常的班級規則均適用。 創建接口時,您需要實現抽象方法或所有方法。
范圍稍有不同,因為您可以訪問嵌套在您的匿名類中的類中聲明的變量。 但是,您不能從匿名類訪問局部變量,除非這些局部變量被聲明為final。 例如:
Button button = new Button(shell, SWT.PUSH);
final String someString = "hello world!";
button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
// Handle the selection event
System.out.println(someString);
}
});
如果在更全局的范圍內聲明someString
則不是這種情況。
關於第二個問題:
是。 您是正確的,這就是代碼段中正在發生的事情。 注意到每次都會創建一個新的PropertyChangeEvent
嗎? 這樣一來,出現在列表前面的偵聽器就不會為列表后面出現的項修改PropertyChangeEvent
。
首先,這是Java特定的語法:C#中沒有可比的語法,您必須在其中創建一個匿名類擴展object
,或者創建一個命名類的實例。
在Java中,此語法使您可以創建SelectionAdapter
的匿名子類,並在您認為合適的情況下覆蓋任何方法。 這等效於創建一個擴展了SelectionAdapter
的命名類,該類將覆蓋任何方法,就像在SelectionAdapter()
構造函數調用之后的花括號中所做的那樣,然后在addSelectionListener
調用中使用該派生類的名稱。 唯一的區別是,此類派生類將具有名稱,而示例中的匿名類沒有名稱*供程序員使用。
*內部匿名類確實具有名稱:如果查看Java編譯器生成的類文件列表,則可以看到它們。 名稱中帶有美元符號和數字的文件對應於匿名類。
當您要創建僅使用一次的實例時,此功能很有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.