第二部分:面向对象编程与 Kotlin 特性
第7章:单例与伴生对象
7.3 扩展伴生对象
1. 什么是扩展伴生对象?
Kotlin 允许通过扩展函数为伴生对象(companion object)添加新的功能,即使原始类或伴生对象的定义不可修改。这种机制称为扩展伴生对象。
2. 语法与实现
扩展伴生对象的语法与普通扩展函数类似,但需通过类名直接访问伴生对象:
class MyClass {
companion object {
fun existingMethod() = println("Existing method")
}
}
// 扩展伴生对象
fun MyClass.Companion.newMethod() {
println("Extended method")
}
// 调用
MyClass.newMethod() // 输出: Extended method
3. 使用场景
- 增强工具类功能:为已有类的伴生对象添加工具方法。
- 第三方库扩展:在不修改源码的情况下为库中的类添加静态方法。
- DSL 支持:结合运算符重载实现领域特定语言。
4. 注意事项
- 扩展函数是静态解析的,无法访问伴生对象的私有成员。
- 若伴生对象未显式命名,默认名为
Companion(如MyClass.Companion)。 - 扩展函数优先级低于伴生对象原有的成员函数。
5. 示例:为 String 的伴生对象添加扩展
fun String.Companion.generateRandom(length: Int): String {
val chars = ('a'..'z') + ('A'..'Z') + ('0'..'9')
return (1..length).map { chars.random() }.joinToString("")
}
// 调用
val randomStr = String.generateRandom(10)
println(randomStr) // 输出类似: "aB3x7pL2qK"
6. 与 Java 互操作性
在 Java 中调用扩展伴生对象时,需通过生成的静态方法访问:
// Java 中调用
MyClass.Companion.newMethod(); // 需传入 Companion 实例(不推荐)
// 更推荐在 Kotlin 中封装为顶层函数
关键点总结
- 扩展伴生对象通过
ClassName.Companion.func()语法实现。 - 适用于无侵入式扩展工具方法,提升代码可维护性。
- 需注意扩展函数的静态解析特性与访问权限限制。
