7 Kotlin 匿名类
对象表达式
通过对象表达式实现一个匿名内部类的对象用于方法的参数中:
hello.setOnClickListener(object : View.OnClickListener {
override fun onClick(v: View?) {
//To change body of created functions use File | Settings | File Templates.
}
})
对象声明
Kotlin 使用 object 关键字来声明一个对象。
Kotlin 中我们可以方便的通过对象声明来获得一个单例。
object XXX {
fun register()
}
引用该对象,我们直接使用其名称即可:
XXX.register()
伴生对象
类内部的对象声明可以用 companion 关键字标记,这样它就与外部类关联在一起,我们就可以直接通过外部类访问到对象的内部元素。
class MyClass {
companion object Factory {
fun create(): MyClass = MyClass()
}
}
val instance = MyClass.create() // 访问到对象的内部元素
注意:一个类里面只能声明一个内部关联对象,即关键字 companion 只能使用一次。
对象表达式和对象声明之间的语义差异
对象表达式和对象声明之间有一个重要的语义差别:
- 对象表达式是在使用他们的地方立即执行的
- 对象声明是在第一次被访问到时延迟初始化的
- 伴生对象的初始化是在相应的类被加载(解析)时,与 Java 静态初始化器的语义相匹配