在Kotlin中,object:
用于声明匿名对象(Anonymous Object),这是实现接口或继承类的轻量级方式,无需显式定义具名类。以下是核心用法和场景:
1. 基本语法
val obj = object : SomeInterface { // 实现接口
override fun method() { ... }
}
val obj2 = object : SomeClass() { // 继承类
override fun method() { ... }
}
2. 典型用途
(1) 实现接口/抽象类的临时实例
interface ClickListener {
fun onClick()
}
button.setOnClickListener(object : ClickListener {
override fun onClick() {
println("Button clicked")
}
})
(2) 重写类方法(类似Java匿名内部类)
val thread = object : Thread() {
override fun run() {
println("Running in anonymous Thread")
}
}
thread.start()
(3) 作为表达式返回值
fun createAdder(x: Int) = object {
fun add(y: Int) = x + y
}
val adder = createAdder(5)
println(adder.add(3)) // 输出 8
3. 与伴生对象(companion object
)的区别
特性 | object: (匿名对象) |
companion object |
作用域 | 临时单例(无类名) | 类内部的静态单例 |
生命周期 | 随引用结束而回收 | 伴随类加载存在 |
典型场景 | 回调、临时实现 | 工厂方法、类级常量 |
4. 注意事项
- • 匿名对象非单例:每次调用
object:
会创建新实例。 - • 访问外部变量:可直接修改捕获的局部变量(与Java不同):
fun countClicks(button: Button): Int { var clicks = 0 button.setOnClickListener(object : ClickListener { override fun onClick() { clicks++ // 直接修改外部变量 } }) return clicks }
5. 实际应用场景
- • Android点击事件(替代Java匿名内部类)
- • 快速实现回调接口
- • 单元测试中的模拟对象(Mock)