companion object
的扩展函数是 Kotlin 中一个强大但稍显复杂的特性,它允许你为类的伴随对象添加新的函数。下面我会通过清晰的示例和解释帮助你理解这个概念。
基本概念
扩展函数允许你为已有的类添加新函数,而无需继承或修改原始类。当这个扩展函数是针对 companion object
时,它就成为了一种"类级别"的扩展。
基本语法
Kotlin
class MyClass {
companion object // 可以命名为 Companion 或其它名称,也可以不命名
}
// 为 MyClass 的 companion object 添加扩展函数
fun MyClass.Companion.sayHello() {
println("Hello from companion extension")
}
为什么需要这种扩展?
-
为已有类添加静态工具方法(类似 Java 的静态方法)
-
保持代码组织性(相关函数集中在一起)
-
无法修改原始类时添加功能
详细示例
示例1:基础使用
Kotlin
class Logger {
companion object // 空的 companion object
}
// 为 Logger 的 companion object 添加扩展函数
fun Logger.Companion.debug(message: String) {
println("[DEBUG] $message")
}
// 使用
fun main() {
Logger.debug("This is a debug message")
// 输出: [DEBUG] This is a debug message
}
示例2:带 receiver 的扩展
Kotlin
class Config {
companion object
}
fun Config.Companion.load(configFile: String): Map<String, String> {
println("Loading config from $configFile")
return mapOf("key" to "value") // 模拟加载配置
}
// 使用
fun main() {
val config = Config.load("app.conf")
println(config) // 输出: {key=value}
}
高级用法
为第三方类添加扩展
Kotlin
// 假设这是一个第三方库中的类,我们不能修改它
class ThirdPartyClass {
companion object
}
// 我们可以为它添加扩展
fun ThirdPartyClass.Companion.newFeature() {
println("Added new feature to third party class")
}
结合泛型使用
Kotlin
class Box<T> {
companion object
}
fun <T> Box.Companion.create(value: T): Box<T> {
println("Creating box with $value")
return Box<T>()
}
// 使用
fun main() {
val stringBox = Box.create("Hello")
val intBox = Box.create(42)
}
与普通扩展函数的区别
特性 | 普通扩展函数 | companion object 扩展函数 |
---|---|---|
定义方式 | fun ClassName.func() |
fun ClassName.Companion.func() |
调用方式 | 实例上调用 | 类名上直接调用 |
访问权限 | 可以访问实例成员 | 只能访问 companion object 成员 |
使用场景 | 增强实例功能 | 添加类级别工具方法 |
实际应用场景
工具类函数:
Kotlin
class StringUtils {
companion object
}
fun StringUtils.Companion.isValidEmail(email: String): Boolean {
return email.contains("@")
}
// 使用
StringUtils.isValidEmail("[email protected]")
DSL 构建:
Kotlin
class HTML {
companion object
}
fun HTML.Companion.div(block: Div.() -> Unit): Div {
val div = Div()
div.block()
return div
}
库的扩展:
Kotlin
// 为 Android 的 Toast 添加扩展
fun Toast.Companion.showShort(context: Context, message: String) {
Toast.makeText(context, message, Toast.LENGTH_SHORT).show()
}
// 使用
Toast.showShort(context, "Hello")
注意事项
companion object 必须存在:
Kotlin
class NoCompanion // 没有 companion object
// 这会编译错误
fun NoCompanion.Companion.extension() {}
命名 companion object:
Kotlin
class Named {
companion object Factory
}
// 必须使用正确的名称
fun Named.Factory.extension() {}
优先级:
- 如果 companion object 本身有同名方法,会优先调用成员方法
- 扩展函数不会覆盖已有方法
通过理解这些概念和示例,你应该能够掌握如何为 companion object
创建和使用扩展函数了。这种技术特别适合在保持代码整洁的同时为类添加实用功能。