本文主要是介绍基于Java实现回调监听工具类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《基于Java实现回调监听工具类》这篇文章主要为大家详细介绍了如何基于Java实现一个回调监听工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下...
首先,会用到 函数式接口 Consumer, 通过这个可以解耦回调方法,下面先写一个抽象的监听接口
监听接口类 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) { javascript 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(www.chinasem.cnListener listener) { synchronized (LISTENERS_WEAK_MAP) { paPCHuzfi Set<LiChina编程stener> 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; } } } } }
实际用法
用法也比较简单,在自己的实现类 MessageManager 中,写上自定义的回调 OnEventListener,然后再实现通知方法,这样就可以很方便的写各种需要一对多通知的不同类型的回调了
public class Main { public static class MessageManager implements Listenable<MessageManager.OnEventListener> { private MessageManager() {} private static final MessageManager instance = new MessageManager(); public static MessageManager getInstance() { returjavascriptn 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实现回调监听工具类的文章就介绍到这了,更多相关Java回调监听内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!
这篇关于基于Java实现回调监听工具类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!