Kotlin 扩展函数java
Kotlin 可以扩展一个类的新功能而无需继承该类或者使用像装饰者这样的设计模式,这样一来,能够为一个你不能修改的、来自第三方库中的类编写一个新的函数。 这个新增的函数就像那个原始类原本就有的函数同样,能够用普通的方法调用。咱们在Android 开发中,对于Android 常常使用的API 均可以结合业务作扩展处理,处理以后便可达到某部分业务相关的API逻辑全盘使用。设计模式
好比对于Fragment中ViewMdoel 对象上下文转换的扩展安全
inline fun <reified T : ViewModel> Fragment.viewModel(
factory: ViewModelProvider.Factory,
body: T.() -> Unit
): T {
val vm = ViewModelProviders.of(this, factory)[T::class.java]
vm.body()
return vm
}
复制代码
目的: 能让咱们在使用的过程当中更加符合阅读的逻辑思惟,更加简便,不使用if else(明文)表达式, 先上代码和测试用例:markdown
代码:BooleanEtx.ktide
package com.kpa.component.ui.extension
/** * @author: kpa * @time: 2021/4/17 * @email: billkp@yeah.net **/
/** * 数据 */
sealed class BooleanExt<out T>
object Otherwise : BooleanExt<Nothing>()
class WithData<T>(val data: T) : BooleanExt<T>()
/** * 判断条件为true 时执行block */
inline fun <T : Any> Boolean.yes(block: () -> T) =
when {
this -> {
WithData(block())
}
else -> {
Otherwise
}
}
/** * 判断条件为false 时执行block * */
inline fun <T> Boolean.no(block: () -> T) = when {
this -> Otherwise
else -> {
WithData(block())
}
}
/** * 与判断条件互斥时执行block */
inline fun <T> BooleanExt<T>.otherwise(block: () -> T): T =
when (this) {
is Otherwise -> block()
is WithData -> this.data
}
复制代码
测试用例:函数
@Test
fun addition_isCorrect() {
true.yes {
// doSomething
}
false.no{
// doSomething
}
// 有返回值(条件为true)
val otherwise = getBoolean().yes {
2
}.otherwise {
1
}
assertEquals(otherwise, 2)
// 有返回值(条件为false)
val otherwise1 = false.no {
2
}.otherwise {
3
}
assertEquals(otherwise1, 2)
}
fun getBoolean() = true
复制代码
这样就能在工做中直接根据业务去写对应的逻辑了,而且使用了inline函数,因此在字节码层面咱们仍是if else 的,因此不需担忧安全问题,简化了代码,惟一添加的开销就是建立数据返回类WithData,固然在咱们开发中是能够忽略不计的。测试