记一次优雅的回调方式

2024-08-30 01:18
文章标签 优雅 方式 一次 回调

本文主要是介绍记一次优雅的回调方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近在用 Lifecycle 时学到了一种优雅的回调写法,特此记录一下。

普通回调

我们在写业务逻辑时难免会遇到需要设置回调的场景,也就是观察者模式,例如下面这个观察者:

public interface Observer {void call();
}

使用时直接添加即可。

public static void main(String[] args) {ObserverManager.addObserver(new Observer() {@Overridepublic void call() {System.out.println("被调用~");}});
}

这种回调写法比较简单,而且开发中也最为常用。

但是当我们观察者接口的方法过多而且每次使用的回调方法只有其中的某几个时,就会重写很多无用方法!

新手同学可能会说可以用一个类来代替接口,有选择的实现对应的回调方法。额,这肯定不行的,因为类是没有多继承的,所以在使用时会有很多的限制。

注解回调

最近看了下 Lifecycle,发现他们在回调时使用的是注解的形式:

class LifecycleActivityObserver(val tvContent: TextView): LifecycleObserver {val loggerStr = StringBuilder()@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)fun onActivityCreate() {}@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)fun onActivityResume() {}@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)fun onActivityPause() {}
}

这种写法很巧妙的解决了上面提到的问题,接下来咱们看下是如何实现的。不过开始前需要简单了解下 Java 注解相关的知识:

Java 注解导图

导图摘自:https://www.cnblogs.com/peida/archive/2013/04/26/3038503.html

简单了解后,写一个自定义的注解:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ObserverEvent {public enum Event {SUCCESS, FAILURE}Event value();
}

然后写一个空接口,用来实现回调方法:

public interface Observer {
}

再写一个 ObserverManager 用来模拟添加观察者,实现数据的回调:

public class ObserverManager {public static void addObserver(final Observer observer) {Class<? extends Observer> clazz = observer.getClass();Method[] methods = clazz.getMethods();Method successMethod = null, failureMethod = null;//遍历所有方法,找到被注解的方法for (Method method : methods) {ObserverEvent annotation = method.getAnnotation(ObserverEvent.class);if (annotation == null) {continue;}if (annotation.value() == ObserverEvent.Event.SUCCESS) {successMethod = method;} else if (annotation.value() == ObserverEvent.Event.FAILURE) {failureMethod = method;}}//测试 直接执行成功回调if (successMethod != null) {try {successMethod.invoke(observer);} catch (Exception e) {e.printStackTrace();}}//测试 延迟执行失败回调if (failureMethod != null) {try {Thread.sleep(2000);failureMethod.invoke(observer);} catch (Exception e) {e.printStackTrace();}}}
}

测试调用:

public static void main(String[] args) {ObserverManager.addObserver(new Observer() {@ObserverEvent(ObserverEvent.Event.SUCCESS)public void callSuccess() {System.out.println("成功回调");}@ObserverEvent(ObserverEvent.Event.FAILURE)public void callFailure() {System.out.println("失败回调");}});
}

真正使用时我们会将 successMethod 和 failureMethod 保存到 List 中,在需要回调的场景中触发回调。

Demo 地址

https://github.com/changer0/AnnotationCallback

以上就是本节内容,欢迎大家关注👇👇👇

长按关注

这篇关于记一次优雅的回调方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1119384

相关文章

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

JS 实现复制到剪贴板的几种方式小结

《JS实现复制到剪贴板的几种方式小结》本文主要介绍了JS实现复制到剪贴板的几种方式小结,包括ClipboardAPI和document.execCommand这两种方法,具有一定的参考价值,感兴趣的... 目录一、Clipboard API相关属性方法二、document.execCommand优点:缺点:

Python创建Excel的4种方式小结

《Python创建Excel的4种方式小结》这篇文章主要为大家详细介绍了Python中创建Excel的4种常见方式,文中的示例代码简洁易懂,具有一定的参考价值,感兴趣的小伙伴可以学习一下... 目录库的安装代码1——pandas代码2——openpyxl代码3——xlsxwriterwww.cppcns.c

Deepseek使用指南与提问优化策略方式

《Deepseek使用指南与提问优化策略方式》本文介绍了DeepSeek语义搜索引擎的核心功能、集成方法及优化提问策略,通过自然语言处理和机器学习提供精准搜索结果,适用于智能客服、知识库检索等领域... 目录序言1. DeepSeek 概述2. DeepSeek 的集成与使用2.1 DeepSeek API

CSS弹性布局常用设置方式

《CSS弹性布局常用设置方式》文章总结了CSS布局与样式的常用属性和技巧,包括视口单位、弹性盒子布局、浮动元素、背景和边框样式、文本和阴影效果、溢出隐藏、定位以及背景渐变等,通过这些技巧,可以实现复杂... 一、单位元素vm 1vm 为视口的1%vh 视口高的1%vmin 参照长边vmax 参照长边re

JavaWeb-WebSocket浏览器服务器双向通信方式

《JavaWeb-WebSocket浏览器服务器双向通信方式》文章介绍了WebSocket协议的工作原理和应用场景,包括与HTTP的对比,接着,详细介绍了如何在Java中使用WebSocket,包括配... 目录一、概述二、入门2.1 POM依赖2.2 编写配置类2.3 编写WebSocket服务2.4 浏