Tailwind CSSTailwind CSS
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
  • 伴生对象(companion object)与静态成员的模拟

伴生对象(companion object)与静态成员的模拟

1. 伴生对象的基本概念

在 Kotlin 中,伴生对象(companion object) 是一个与类关联的特殊对象,用于模拟 Java 中的静态成员(静态方法和静态属性)。每个类只能有一个伴生对象,其名称可以省略(默认为 Companion),也可以自定义。

语法示例

class MyClass {
    companion object {
        const val CONSTANT_VALUE = 100  // 静态常量
        fun staticMethod() {           // 静态方法
            println("This is a static method.")
        }
    }
}

2. 伴生对象的特点

  1. 单例性:伴生对象是类的静态成员,全局唯一。
  2. 直接通过类名访问:无需实例化类即可调用伴生对象的成员。
  3. 可继承接口:伴生对象可以实现接口,扩展功能。

调用方式

MyClass.CONSTANT_VALUE       // 访问静态常量
MyClass.staticMethod()       // 调用静态方法

3. 伴生对象 vs Java 静态成员

特性Kotlin 伴生对象Java 静态成员
定义方式通过 companion object 块使用 static 关键字
成员访问通过类名直接访问通过类名直接访问
支持接口实现是否
运行时类型是真实对象(可赋值给变量)无对象实例

4. 实际应用场景

4.1 工厂模式

class User private constructor(val name: String) {
    companion object {
        fun create(name: String): User {
            return User(name)
        }
    }
}

// 使用
val user = User.create("Alice")

4.2 常量定义

class Config {
    companion object {
        const val API_URL = "https://api.example.com"
    }
}

4.3 实现接口

interface Logger {
    fun log(message: String)
}

class MyService {
    companion object : Logger {
        override fun log(message: String) {
            println("[LOG] $message")
        }
    }
}

// 调用
MyService.log("Service initialized")

5. 注意事项

  1. 性能影响:伴生对象是真实对象,首次访问时会初始化,但开销极小。
  2. JVM 注解:如需在 Java 中像调用静态方法一样使用,可用 @JvmStatic 注解:
    companion object {
        @JvmStatic
        fun utilityMethod() { ... }
    }
    
  3. 命名伴生对象:
    companion object Named {
        // ...
    }
    
    调用时可通过 MyClass.Named.method() 访问。

6. 总结

Kotlin 的伴生对象提供了比 Java 静态成员更灵活的功能,同时保持了相似的调用方式。它是实现工具方法、常量定义和工厂模式的理想选择,同时支持面向对象的高级特性(如接口实现)。

Last Updated:: 5/21/25, 7:58 PM