记一次优雅的回调方式

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

相关文章

Linux给磁盘扩容(LVM方式)的方法实现

《Linux给磁盘扩容(LVM方式)的方法实现》本文主要介绍了Linux给磁盘扩容(LVM方式)的方法实现,涵盖PV/VG/LV概念及操作步骤,具有一定的参考价值,感兴趣的可以了解一下... 目录1 概念2 实战2.1 相关基础命令2.2 开始给LVM扩容2.3 总结最近测试性能,在本地打数据时,发现磁盘空

java对接第三方接口的三种实现方式

《java对接第三方接口的三种实现方式》:本文主要介绍java对接第三方接口的三种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录HttpURLConnection调用方法CloseableHttpClient调用RestTemplate调用总结在日常工作

windows和Linux安装Jmeter与简单使用方式

《windows和Linux安装Jmeter与简单使用方式》:本文主要介绍windows和Linux安装Jmeter与简单使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows和linux安装Jmeter与简单使用一、下载安装包二、JDK安装1.windows设

CSS 样式表的四种应用方式及css注释的应用小结

《CSS样式表的四种应用方式及css注释的应用小结》:本文主要介绍了CSS样式表的四种应用方式及css注释的应用小结,本文通过实例代码给大家介绍的非常详细,详细内容请阅读本文,希望能对你有所帮助... 一、外部 css(推荐方式)定义:将 CSS 代码保存为独立的 .css 文件,通过 <link> 标签

SpringCloud整合MQ实现消息总线服务方式

《SpringCloud整合MQ实现消息总线服务方式》:本文主要介绍SpringCloud整合MQ实现消息总线服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、背景介绍二、方案实践三、升级版总结一、背景介绍每当修改配置文件内容,如果需要客户端也同步更新,

Java实例化对象的​7种方式详解

《Java实例化对象的​7种方式详解》在Java中,实例化对象的方式有多种,具体取决于场景需求和设计模式,本文整理了7种常用的方法,文中的示例代码讲解详细,有需要的可以了解下... 目录1. ​new 关键字(直接构造)​2. ​反射(Reflection)​​3. ​克隆(Clone)​​4. ​反序列化

linux服务之NIS账户管理服务方式

《linux服务之NIS账户管理服务方式》:本文主要介绍linux服务之NIS账户管理服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、所需要的软件二、服务器配置1、安装 NIS 服务2、设定 NIS 的域名 (NIS domain name)3、修改主

使用Nginx配置文件服务器方式

《使用Nginx配置文件服务器方式》:本文主要介绍使用Nginx配置文件服务器方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 为什么选择 Nginx 作为文件服务器?2. 环境准备3. 配置 Nginx 文件服务器4. 将文件放入服务器目录5. 启动 N

使用nohup和--remove-source-files在后台运行rsync并记录日志方式

《使用nohup和--remove-source-files在后台运行rsync并记录日志方式》:本文主要介绍使用nohup和--remove-source-files在后台运行rsync并记录日... 目录一、什么是 --remove-source-files?二、示例命令三、命令详解1. nohup2.

MySQL Workbench工具导出导入数据库方式

《MySQLWorkbench工具导出导入数据库方式》:本文主要介绍MySQLWorkbench工具导出导入数据库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录mysql Workbench工具导出导入数据库第一步 www.chinasem.cn数据库导出第二步