基于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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot項目啟動過程動態(tài)修改接口請求路徑的解決方案
在SpringBoot服務整合過程中,遇到了多個服務中相同RequestMapping路徑導致的啟動問題,解決方案是通過修改RequestMappingHandlerMapping類的getMappingForMethod方法,本文給大家介紹SpringBoot修改接口請求路徑的解決方案,感興趣的朋友一起看看吧2024-09-09
SpringBoot yml配置敏感信息加密的實現(xiàn)
本文主要介紹了SpringBoot yml配置敏感信息加密的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2025-08-08
java+jsp+struts2實現(xiàn)發(fā)送郵件功能
這篇文章主要為大家詳細介紹了java+jsp+struts2實現(xiàn)發(fā)送郵件功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-03-03
使用lombok的@Data會導致棧溢出StackOverflowError問題
這篇文章主要介紹了使用lombok的@Data會導致棧溢出StackOverflowError問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11

