如何让你的回调更具Kotlin风味

2024-08-27 14:38
文章标签 kotlin 回调 更具 风味

本文主要是介绍如何让你的回调更具Kotlin风味,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简述: 这应该是2019年的第一篇文章了,临近过年回家一个月需求是真的很多,正如康少说的那样,一年的需求几乎都在最后一两月写完了。所以写文章也搁置了很久,当然再忙每天都会刷掘金。很久就一直在使用Kotlin写项目,说实话到目前为止Kotlin用的是越来越顺手了(心里只能用美滋滋来形容了)。当然这次依然讲的是Kotlin,说下我这次需求开发中自己一些思考和实践。其中让自己感受最深的就是: “Don’t Repeat Yourself”。当你经常写一些重复性的代码,不妨停下来想下是否要去改变这样一种状态。

今天我们来讲个非常非常简单的东西,那就是回调俗称Callback, 在Android开发以及一些客户端开发中经常会使用回调。其实如果端的界面开发当做一个黑盒的话,无非就是输入和输出,输入数据,输出UI的渲染以及用户的交互事件,那么这个交互事件大多数场景会采用回调来实现。那么今天一起来说说如何让你的回调更具kotlin风味:

  • 1、Java中的回调实现
  • 2、使用Kotlin来改造Java中的回调
  • 3、进一步让你的回调更具Kotlin风味
  • 4、Object对象表达式回调和DSL回调对比
  • 5、Kotlin中回调使用建议
  • 6、Don’t Repeat Yourself(DSL回调配置太模板化了,不妨来撸个自动生成代码的AS插件吧)
  • 7、DslListenerBuilder插件基本介绍和使用
  • 8、DslListenerBuilder插件源码和Velocity模板引擎基本介绍
  • 9、总结

一、Java中的回调实现

Java中的回调一般处理步骤都是写一个接口,然后在接口中定义一些回调函数;然后再暴露一个设置回调接口的函数,传入函数实参就是回调接口的一个实例,一般情况都是以匿名对象形式存在。例如以Android中OnClickListener和TextWatcher源码为例:

  • 1、OnClickListener回调的Java实现
//OnClickListener的定义
public interface OnClickListener {void onClick(View v);
}public void setOnClickListener(OnClickListener listener) {this.clickListener = listener;
}//OnClickListener的使用
mBtnSubmit.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//add your logic code}
});
  • 2、TextWatcher回调的Java实现
//TextWatcher的定义
public interface TextWatcher extends NoCopySpan {public void beforeTextChanged(CharSequence s, int start,int count, int after);public void onTextChanged(CharSequence s, int start, int before, int count);public void afterTextChanged(Editable s);
}public void addTextChangedListener(TextWatcher watcher) {if (mListeners == null) {mListeners = new ArrayList<TextWatcher>();}mListeners.add(watcher);
}//TextWatcher的使用
mEtComment.addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {//add your logic code}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {//add your logic code}@Overridepublic void afterTextChanged(Editable s) {//add your logic code}
});

二、使用Kotlin来改造Java中的回调

针对上述Java中的回调写法,估计大部分人转到Kotlin后,估计会做如下处理:

1、如果接口只有一个回调函数可以直接使用lamba表达式实现回调的简写。

2、如果接口中含有多个回调函数,都会使用object对象表达式来实现的。

以改造上述代码为例:

  • 1、(只有一个回调函数简写形式)OnClickListener回调Kotlin改造
//只有一个回调函数普通简写形式: OnClickListener的使用
mBtnSubmit.setOnClickListener { view ->//add your logic code
}//针对OnClickListener监听设置Coroutine协程框架中onClick扩展函数的使用
mBtnSubmit.onClick { view ->//add your logic code
}//Coroutine协程框架: onClick的扩展函数定义
fun android.view.View.onClick(context: CoroutineContext = UI,handler: suspend CoroutineScope.(v: android.view.View?) -> Unit
) {setOnClickListener { v ->launch(context) {handler(v)}}
}
  • 2、(多个回调函数object表达式)TextWatcher回调的Kotlin改造(object对象表达式)
mEtComment.addTextChangedListener(object: TextWatcher{override fun af

这篇关于如何让你的回调更具Kotlin风味的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

基于Java实现回调监听工具类

《基于Java实现回调监听工具类》这篇文章主要为大家详细介绍了如何基于Java实现一个回调监听工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录监听接口类 Listenable实际用法打印结果首先,会用到 函数式接口 Consumer, 通过这个可以解耦回调方法,下面先写一个

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java

Kotlin 作用域函数apply、let、run、with、also使用指南

《Kotlin作用域函数apply、let、run、with、also使用指南》在Kotlin开发中,作用域函数(ScopeFunctions)是一组能让代码更简洁、更函数式的高阶函数,本文将... 目录一、引言:为什么需要作用域函数?二、作用域函China编程数详解1. apply:对象配置的 “流式构建器”最

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

kotlin的函数forEach示例详解

《kotlin的函数forEach示例详解》在Kotlin中,forEach是一个高阶函数,用于遍历集合中的每个元素并对其执行指定的操作,它的核心特点是简洁、函数式,适用于需要遍历集合且无需返回值的场... 目录一、基本用法1️⃣ 遍历集合2️⃣ 遍历数组3️⃣ 遍历 Map二、与 for 循环的区别三、高

kotlin中的数据转换方法(示例详解)

《kotlin中的数据转换方法(示例详解)》这篇文章介绍了Kotlin中将数字转换为字符串和字符串转换为数字的多种方法,包括使用`toString()`、字符串模板、格式化字符串、处理可空类型等,同时... 目录1. 直接使用 toString() 方法2. 字符串模板(自动转换)3. 格式化字符串(控制输

kotlin中的行为组件及高级用法

《kotlin中的行为组件及高级用法》Jetpack中的四大行为组件:WorkManager、DataBinding、Coroutines和Lifecycle,分别解决了后台任务调度、数据驱动UI、异... 目录WorkManager工作原理最佳实践Data Binding工作原理进阶技巧Coroutine

kotlin中的模块化结构组件及工作原理

《kotlin中的模块化结构组件及工作原理》本文介绍了Kotlin中模块化结构组件,包括ViewModel、LiveData、Room和Navigation的工作原理和基础使用,本文通过实例代码给大家... 目录ViewModel 工作原理LiveData 工作原理Room 工作原理Navigation 工

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

Python中的异步:async 和 await以及操作中的事件循环、回调和异常

《Python中的异步:async和await以及操作中的事件循环、回调和异常》在现代编程中,异步操作在处理I/O密集型任务时,可以显著提高程序的性能和响应速度,Python提供了asyn... 目录引言什么是异步操作?python 中的异步编程基础async 和 await 关键字asyncio 模块理论