基于Java實(shí)現(xiàn)回調(diào)監(jiān)聽工具類
首先,會(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í)搶紅包)的實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-12-12
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)
這篇文章主要為大家詳細(xì)介紹了Java簡(jiǎn)單計(jì)算器的實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12
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)景詳解,讀寫狀態(tài)的設(shè)計(jì),寫鎖的獲取與釋放,鎖降級(jí)需要的朋友可以參考下2023-02-02
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問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11

