Kotlin object
关键字详解
object
是 Kotlin 中一个非常有用的关键字,主要用于实现单例模式、伴生对象和对象表达式(匿名对象)。下面详细介绍它的各种用法和特性。
1. 对象声明(单例模式)
最简单的用法是创建单例:
kotlin
object Singleton {
val name = "Singleton"
fun doSomething() {
println("Doing something")
}
}
// 使用方式
fun main() {
Singleton.doSomething() // 直接通过类名访问
println(Singleton.name)
}
特点:
- 线程安全
- 懒加载(首次访问时初始化)
- 不能有构造函数
- 相当于 Java 的静态单例
2. 伴生对象(Companion Object)
相当于 Java 的静态成员,但更灵活:
kotlin
class MyClass {
companion object {
const val CONSTANT = "constant"
fun create(): MyClass = MyClass()
}
}
// 使用方式
fun main() {
println(MyClass.CONSTANT) // 直接通过类名访问
val instance = MyClass.create()
}
特点:
- 一个类只能有一个伴生对象
- 可以命名(
companion object Factory
) - 可以实现接口
- 可以继承类
3. 对象表达式(匿名对象)
替代 Java 的匿名内部类:
kotlin
interface ClickListener {
fun onClick()
}
fun setClickListener(listener: ClickListener) {
// ...
}
// 使用对象表达式
fun main() {
setClickListener(object : ClickListener {
override fun onClick() {
println("Clicked")
}
})
}
特点:
- 可以继承类和实现多个接口
- 可以访问闭包中的变量(与 Java 不同,非 final 变量也可访问)
- 每次调用都会创建新实例
4. 与 Java 互操作
从 Java 调用 Kotlin 对象:
java
// 调用对象声明
Singleton.INSTANCE.doSomething();
// 调用伴生对象
MyClass.Companion.create();
如果伴生对象有名称,则使用该名称代替 Companion
。
使用 @JvmStatic
注解:
kotlin
class MyClass {
companion object {
@JvmStatic
fun create(): MyClass = MyClass()
}
}
这样在 Java 中就可以直接通过 MyClass.create()
调用。
5. 对象声明的继承
对象声明可以继承类和实现接口:
kotlin
open class Parent
interface Interface
object Child : Parent(), Interface {
// ...
}
6. 数据对象(Kotlin 1.7+)
从 Kotlin 1.7 开始,可以对对象声明使用 data
修饰符:
kotlin
data object UserProfile
会自动生成 toString()
方法,格式为 "UserProfile"。
实际应用场景
- 工具类:使用对象声明实现无状态的工具类
- 工厂模式:通过伴生对象提供创建方法
- 回调接口:使用对象表达式实现一次性回调
- 全局配置:使用对象声明存储应用配置
- 枚举扩展:当需要单例但有更复杂行为时替代枚举
注意事项
- 对象声明不能是局部的(不能直接放在函数内)
- 对象表达式可以捕获闭包变量,但要注意内存泄漏风险
- 伴生对象的初始化时机与 Java 静态块不同
- 对象声明不能有构造函数参数
object
关键字是 Kotlin 简化设计模式实现的重要特性,合理使用可以大大减少样板代码。