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

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

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

首先,會(huì)用到 函數(shù)式接口 Consumer, 通過這個(gè)可以解耦回調(diào)方法,下面先寫一個(gè)抽象的監(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;
                }
            }
        }
    }


}

實(shí)際用法

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

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");
    }
}

打印結(jié)果

onSuccess My json
onError code:-1 error:Error

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

相關(guān)文章

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

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

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

    詳解Spring如何整合Mybatis

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

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

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

    Java簡(jiǎn)單計(jì)算器的實(shí)現(xiàn)

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

    在Spring異步調(diào)用中傳遞上下文的方法

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

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

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

    Java讀寫鎖ReadWriteLock原理與應(yīng)用場(chǎng)景詳解

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

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

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

    使用lombok的@Data會(huì)導(dǎo)致棧溢出StackOverflowError問題

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

    詳解Java內(nèi)存泄露的示例代碼

    這篇文章通過一個(gè)Demo來簡(jiǎn)要介紹下ThreadLocal和ClassLoader導(dǎo)致內(nèi)存泄露最終OutOfMemory的場(chǎng)景。下面通過示例代碼給大家分享Java內(nèi)存泄露的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2017-12-12

最新評(píng)論

漠河县| 边坝县| 黄山市| 丹寨县| 涞源县| 阿克陶县| 沙洋县| 城步| 扬州市| 博爱县| 天等县| 丹寨县| 永新县| 杭锦后旗| 奉贤区| 稻城县| 宿州市| 连南| 济宁市| 临邑县| 丰镇市| 北流市| 博兴县| 兰州市| 新郑市| 徐水县| 长宁区| 云梦县| 陆河县| 柳河县| 乐陵市| 霍州市| 如东县| 太和县| 建宁县| 丘北县| 呼伦贝尔市| 满城县| 积石山| 绍兴县| 沁阳市|