[英]Understanding callbacks in Java
我一直在努力回避回調,並且一直在努力理解這個概念。 以下代碼是我在這里找到的示例
從頭到尾我都知道流程是這樣的:
CallMe
被實例化,從而調用所述類的構造函數 en
,隨后實例化EventNotifier
類並調用其構造函數,該構造函數將傳遞對對象CallMe
的引用 ie
設置為傳遞給構造函數的對象CallMe
somethinghappened
設置為false(我假設將使用一些條件語句來確定是否設置該值) 我不明白此代碼。 doWork
如何被調用? 這如何表示事件? 為什么一個不能簡單地調用interestingevent
從構造callme
....對於這個問題,為什么不就叫dowork
代替任何會改變的價值somethinghappened
?
嘗試嘗試,我似乎無法理解這個想法。 我知道回調主要用於表示事件的發生,例如鼠標或按鈕的單擊,但是它如何使事件發生與被調用的方法之間建立聯系? 是否應該沒有一個循環來檢查更改並由此觸發事件?
有人可以在Java中提供回調的說明(而不是過於簡化),並幫助闡明類似的用法如何有用嗎?
public interface InterestingEvent
{
public void interestingEvent ();
}
public class EventNotifier
{
private InterestingEvent ie;
private boolean somethingHappened;
public EventNotifier (InterestingEvent event)
{
ie = event;
somethingHappened = false;
}
public void doWork ()
{
if (somethingHappened)
{
ie.interestingEvent ();
}
}
}
public class CallMe implements InterestingEvent
{
private EventNotifier en;
public CallMe ()
{
en = new EventNotifier (this);
}
public void interestingEvent ()
{
// Wow! Something really interesting must have occurred!
// Do something...
}
}
編輯:請參閱批准的答案中的評論... --- 此 ---鏈接對我非常有幫助=)
沒有主要方法或靜態塊。 您發布的代碼實際上沒有運行任何內容; 因此,永遠不會調用doWork()
。 我閱讀了這篇文章並查看了代碼,它似乎是不完整的,或者由於作者認為不需要對其進行解釋而遺漏了一些代碼。
這是要點:
我們有一個interface InterestingEvent
,一個class EventNotifier
類和另一個implements InterestingEvent
CallMe
類。
EventNotifier
在其構造函數中使用InterestingEvent
,並將somethingHappened
設置為false
。
CallMe
的構造函數通過向EventNotifier
構造函數傳遞對CallMe
對象本身的引用來初始化其EventNotifier
實例成員。
以下不是代碼中的內容,但是如果我們檢測到發生了某些特定的操作,我們將設置somethingHappened = true
。 因此,此后,如果為EventNotifier
調用doWork()
,則將在該EventNotifier
的InterestingEvent ie
上調用interestingEvent()
。 我們可以做到這一點,因為CallMe implements InterestingEvent
。
注意:本文來自1996年,此后發生了很大變化。 您提到了如何檢測鼠標單擊事件,但這是不同的。 我認為,本文的重點是說明如何將對象與接口和布爾值結合使用,以查看是否發生了某些情況。
要真正檢測到鼠標單擊,請看一下本教程 。 這是另一篇有關編寫事件監聽器的教程。 最后,既然您在注釋中詢問了有關線程的問題,那么這是一本很棒的書: Java Concurrency in Practice 。
我通常使用回調的方法是使用PropertyChangeListeners / PropertyChangeSupport類。 關於這些類,可能會有很多不同的解釋,您可能會發現它們對您有所幫助。
無論如何,就您的問題而言。
首先,您需要了解兩個類通常在不同的線程上運行。 回調的作用是讓您獲得異步通知,告知其他線程發生了事情。 這允許通知線程在重新獲得控制時發揮其作用。 例如,您有一條正在接收數據的串行線。 InterestingEvent大約有10個字符到達此行。 現在,不再只有一個EventNotifier,而是為每個進入的串行線分配一個EventNotifier。CallMe實例將在運行某項操作,並定期檢查是否已調用趣事。 funnyEvent將設置某種標志,以便CallMe知道它有新數據要處理。 當CallMe看到該消息時,它會處理趣事,然后再返回其正常活動。
接口的重點是要有一種定義明確的方法來訪問CallMe的實例。 如果您對此進行更多開發,則可能要管理正在訪問您的CallMe實例的其他實例。 在那兒,閱讀我前面提到的PropertyChange內容將非常有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.