最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Java實現(xiàn)回調監(jiān)聽工具類

 更新時間:2025年04月18日 08:10:40   作者:IT樂手  
這篇文章主要為大家詳細介紹了如何基于Java實現(xiàn)一個回調監(jiān)聽工具類,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下

首先,會用到 函數(shù)式接口 Consumer, 通過這個可以解耦回調方法,下面先寫一個抽象的監(jiān)聽接口

監(jiān)聽接口類 Listenable

import java.util.*;
import java.util.function.Consumer;

public interface Listenable<Listener> {

    WeakHashMap<Object, Set> LISTENERS_WEAK_MAP = new WeakHashMap<>();

    default void registerListener(Listener listener) {
        Objects.requireNonNull(listener);
        Set<Listener> listeners;
        synchronized (LISTENERS_WEAK_MAP) {
            listeners = LISTENERS_WEAK_MAP.get(this);
            if (listeners == null) {
                listeners = new HashSet<>();
                LISTENERS_WEAK_MAP.put(this, listeners);
            }
        }
        synchronized (listeners) {
            listeners.add(listener);
        }
    }

    default void unregisterListener(Listener listener) {
        Objects.requireNonNull(listener);
        Set<Listener> listeners;
        synchronized (LISTENERS_WEAK_MAP) {
            listeners = LISTENERS_WEAK_MAP.get(this);
            if (listeners == null) {
                return;
            }
        }
        synchronized (listeners) {
            listeners.remove(listener);
        }
    }

    default Collection<Listener> getListeners() {
        synchronized (LISTENERS_WEAK_MAP) {
            Set<Listener> listeners = LISTENERS_WEAK_MAP.get(this);
            if (listeners == null) {
                return new HashSet<>();
            }
            return new HashSet<>(listeners);
        }
    }

    default boolean isListenerRegistered(Listener listener) {
        synchronized (LISTENERS_WEAK_MAP) {
            Set<Listener> listeners = LISTENERS_WEAK_MAP.get(this);
            if (listeners == null) {
                return false;
            }
            return listeners.contains(listener);
        }
    }

    default void forEachListener(Consumer<Listener> action) {
        forEachListener(action, true);
    }

    default void forEachListener(Consumer<Listener> action, boolean ignoreException) {
        Objects.requireNonNull(action);
        Iterable<Listener> listeners;
        synchronized (LISTENERS_WEAK_MAP) {
            Set<Listener> values = LISTENERS_WEAK_MAP.get(this);
            if (values == null) {
                return;
            }
            listeners = new ArrayList<>(values);
        }
        for (Listener listener : listeners) {
            try {
                action.accept(listener);
            } catch (Exception e) {
                if (!ignoreException) {
                    throw e;
                }
            }
        }
    }


}

實際用法

用法也比較簡單,在自己的實現(xiàn)類 MessageManager 中,寫上自定義的回調 OnEventListener,然后再實現(xiàn)通知方法,這樣就可以很方便的寫各種需要一對多通知的不同類型的回調了

public class Main {

    public static class MessageManager implements Listenable<MessageManager.OnEventListener> {

        private MessageManager() {}

        private static final MessageManager instance = new MessageManager();

        public static MessageManager getInstance() {
            return instance;
        }

        public void onSuccess(String json) {
            forEachListener(it->it.onSuccess(json));
        }

        public void onError(int code, String error) {
            forEachListener(it->it.onError(code, error));
        }

        public interface OnEventListener {
            void onSuccess(String json);
            void onError(int code, String error);
        }
    }

    public static void main(String[] args) {
        MessageManager.getInstance().registerListener(new MessageManager.OnEventListener() {

            @Override
            public void onSuccess(String json) {
                System.out.println("onSuccess " + json);
            }

            @Override
            public void onError(int code, String error) {
                System.out.println("onError code:" + code + " error:" + error);
            }
        });

        MessageManager.getInstance().onSuccess("My json");
        MessageManager.getInstance().onError(-1, "Error");
    }
}

打印結果

onSuccess My json
onError code:-1 error:Error

到此這篇關于基于Java實現(xiàn)回調監(jiān)聽工具類的文章就介紹到這了,更多相關Java回調監(jiān)聽內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • JAVA實現(xiàn)簡單搶紅包算法(模擬真實搶紅包)

    JAVA實現(xiàn)簡單搶紅包算法(模擬真實搶紅包)

    這篇文章主要介紹了JAVA實現(xiàn)簡單搶紅包算法(模擬真實搶紅包)的實例代碼,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-12-12
  • 詳解Spring如何整合Mybatis

    詳解Spring如何整合Mybatis

    今天給大家?guī)淼氖顷P于Java的相關知識,文章圍繞著Spring如何整合Mybatis展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • SpringBoot項目啟動過程動態(tài)修改接口請求路徑的解決方案

    SpringBoot項目啟動過程動態(tài)修改接口請求路徑的解決方案

    在SpringBoot服務整合過程中,遇到了多個服務中相同RequestMapping路徑導致的啟動問題,解決方案是通過修改RequestMappingHandlerMapping類的getMappingForMethod方法,本文給大家介紹SpringBoot修改接口請求路徑的解決方案,感興趣的朋友一起看看吧
    2024-09-09
  • Java簡單計算器的實現(xiàn)

    Java簡單計算器的實現(xiàn)

    這篇文章主要為大家詳細介紹了Java簡單計算器的實現(xiàn),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • 在Spring異步調用中傳遞上下文的方法

    在Spring異步調用中傳遞上下文的方法

    這篇文章主要給大家介紹了關于如何在Spring異步調用中傳遞上下文的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Spring具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-08-08
  • SpringBoot yml配置敏感信息加密的實現(xiàn)

    SpringBoot yml配置敏感信息加密的實現(xiàn)

    本文主要介紹了SpringBoot yml配置敏感信息加密的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-08-08
  • Java讀寫鎖ReadWriteLock原理與應用場景詳解

    Java讀寫鎖ReadWriteLock原理與應用場景詳解

    這篇文章主要介紹了Java讀寫鎖ReadWriteLock原理與應用場景詳解,讀寫狀態(tài)的設計,寫鎖的獲取與釋放,鎖降級需要的朋友可以參考下
    2023-02-02
  • java+jsp+struts2實現(xiàn)發(fā)送郵件功能

    java+jsp+struts2實現(xiàn)發(fā)送郵件功能

    這篇文章主要為大家詳細介紹了java+jsp+struts2實現(xiàn)發(fā)送郵件功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • 使用lombok的@Data會導致棧溢出StackOverflowError問題

    使用lombok的@Data會導致棧溢出StackOverflowError問題

    這篇文章主要介紹了使用lombok的@Data會導致棧溢出StackOverflowError問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 詳解Java內存泄露的示例代碼

    詳解Java內存泄露的示例代碼

    這篇文章通過一個Demo來簡要介紹下ThreadLocal和ClassLoader導致內存泄露最終OutOfMemory的場景。下面通過示例代碼給大家分享Java內存泄露的相關知識,感興趣的朋友一起看看吧
    2017-12-12

最新評論

资阳市| 始兴县| 五河县| 乐都县| 德钦县| 淅川县| 平远县| 西华县| 晋宁县| 灵丘县| 荆州市| 东乌| 景洪市| 彭山县| 安泽县| 若羌县| 潼关县| 讷河市| 通州区| 南安市| 黎川县| 东源县| 西林县| 精河县| 瑞昌市| 平泉县| 彰化市| 嘉祥县| 崇明县| 娄底市| 楚雄市| 盐边县| 任丘市| 将乐县| 保靖县| 宝应县| 平利县| 和平区| 黄山市| 宜宾市| 江津市|