Kotlin 面向对象 - 匿名内部类、匿名内部类简化

匿名内部类

kotlin 复制代码
interface RequestObserver {
    fun onSuccess(data: String)
    fun onError(error: String)
}
kotlin 复制代码
fun requestUserInfo(requestObserver: RequestObserver) {
    val requestResult = true

    Thread {
        Thread.sleep(3 * 1000)

        if (requestResult) {
            requestObserver.onSuccess("requestUserInfo 请求成功")
        } else {
            requestObserver.onError("requestUserInfo 请求失败")
        }
    }.start()
}
kotlin 复制代码
requestUserInfo(
    object : RequestObserver {
        override fun onSuccess(data: String) {
            Toast.makeText(context, data, Toast.LENGTH_SHORT).show()
        }

        override fun onError(error: String) {
            Toast.makeText(context, error, Toast.LENGTH_SHORT).show()
        }
    }
)

匿名内部类简化

kotlin 复制代码
fun interface SimpleRequestObserver {
    fun onFinish(result: String)
}
kotlin 复制代码
fun simpleRequestUserInfo(simpleRequestObserver: SimpleRequestObserver) {
    Thread {
        Thread.sleep(3 * 1000)

        simpleRequestObserver.onFinish("simpleRequestUserInfo 请求完成")
    }.start()
}
  1. 当接口只有一个抽象方法时,允许使用 fun 关键字修饰接口,这样可以简化实现,省略 object 关键字
kotlin 复制代码
// 冗余的写法

simpleRequestUserInfo(
    SimpleRequestObserver {
        Toast.makeText(context, it, Toast.LENGTH_SHORT).show()
    }
)
kotlin 复制代码
simpleRequestUserInfo(
    {
        Toast.makeText(context, it, Toast.LENGTH_SHORT).show()
    }
)
kotlin 复制代码
// 等价于

simpleRequestUserInfo(
    object : SimpleRequestObserver {
        override fun onFinish(result: String) {
            Toast.makeText(context, result, Toast.LENGTH_SHORT).show()
        }
    }
)
  1. 也可以使用 Lambda 表达式,最简洁的实现
kotlin 复制代码
simpleRequestUserInfo {
    Toast.makeText(context, it, Toast.LENGTH_SHORT).show()
}
  1. fun 关键字无法修饰有多个抽象方法的接口
kotlin 复制代码
fun interface RequestObserver {
    fun onSuccess(data: String)
    fun onError(error: String)
}
复制代码
# 输出结果

Fun interfaces must have exactly one abstract method
  1. 所有 Java 定义的、只有一个抽象方法的接口,都可以自动用 Lambda 表达式,哪怕接口不是用 fun 关键字修饰的
java 复制代码
@FunctionalInterface
public interface Runnable {
    public abstract void run();
}
kotlin 复制代码
Thread {
    println("线程运行中: ${Thread.currentThread().name}")
}.start()
相关推荐
守月满空山雪照窗几秒前
图形 API 体系解析:Android Vulkan / OpenGL 与主流图形 API 对比
android
我命由我123451 分钟前
Android 开发,getSystemService 警告信息:Must be one of: Context. POWER_SERVICE ...
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
1candobetter2 分钟前
JAVA后端开发—— Maven 生命周期与 IDEA 中Maven 插件面板介绍
java·maven·intellij-idea
Fate_I_C3 分钟前
Kotlin 与 Java 互操作空安全处理策略
java·安全·kotlin
zopple5 分钟前
Laravel3.x经典特性回顾
android·java·数据库
一只小小Java9 分钟前
IDEA 的spring boot yaml没有叶子图标了
java·spring boot·intellij-idea
卢锡荣11 分钟前
单芯双 C 盲插,一线通显电 ——LDR6020P 盲插 Type‑C 显示器方案深度解析
c语言·开发语言·ios·计算机外设·电脑
俺爱吃萝卜11 分钟前
Java 性能调优实战:从 JVM 内存模型到垃圾回收算法优化
java·jvm·算法
legendary_16311 分钟前
PD显示器方案新维度:Type-C充电,投屏,显示技术革新
c语言·开发语言·计算机外设
ic爱吃蓝莓12 分钟前
美团测开一面
java·开发语言