簡體   English   中英

了解Java中的回調

[英]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() ,則將在該EventNotifierInterestingEvent 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM