返回

Kotlin 中 Companion 对象的详尽指南

Android

Kotlin 的出现给 Java 开发人员带来了显著的变化,其中最重大的变化之一就是弃用 static 修饰符。与 Java 不同,Kotlin 中的类不允许声明静态成员或方法。相反,您必须向类中添加 Companion 对象来封装这些静态引用。虽然这种差异看起来微不足道,但它具有明显的不同之处。

首先,Companion 对象与其他类的伴生对象相似。它可以包含静态成员和方法,但它直接与类关联。这意味着,您可以通过类名直接访问 Companion 对象中的成员,而无需创建该类的实例。

其次,Companion 对象是单例模式的天然实现。无论您创建了多少类的实例,始终只存在一个 Companion 对象。这使其成为存储静态数据的理想选择,例如常量、实用程序方法和工厂方法。

以下是一些使用 Companion 对象的常见场景:

  • 常量存储: 存储不会随着类的实例而改变的常量,例如应用程序版本或 API 端点 URL。
  • 实用程序方法: 提供有助于类操作的静态方法,例如验证方法或转换方法。
  • 工厂方法: 创建类的实例,而无需使用构造函数。这对于创建不可变对象或管理对象的创建过程非常有用。
  • 单例访问: 提供对类中单例对象的访问,例如数据库连接或缓存。

要创建 Companion 对象,请在类中使用 companion object 。例如:

class Person {

    companion object {
        const val DEFAULT_AGE = 18
        fun createPerson(name: String) = Person(name, DEFAULT_AGE)
    }

    var name: String
    var age: Int

    constructor(name: String, age: Int) {
        this.name = name
        this.age = age
    }
}

在这个示例中,Person 类的 Companion 对象包含一个常量 DEFAULT_AGE 和一个工厂方法 createPerson。您可以通过类名直接访问这些成员:

val defaultAge = Person.DEFAULT_AGE
val person = Person.createPerson("John")

Companion 对象与 Java 中的静态成员之间存在一些关键差异:

  • 访问控制: Companion 对象中的成员可以具有与类本身相同的访问控制级别。静态成员始终具有 public 访问权限。
  • 继承: Companion 对象不能被子类继承,而静态成员可以。
  • 可重写性: Companion 对象中的成员不能被重写,而静态成员可以。
  • 对象引用: Companion 对象可以引用类的其他成员,包括非静态成员。静态成员不能引用非静态成员。

使用 Companion 对象时,请遵循以下最佳实践:

  • 仅在需要时创建 Companion 对象。并非所有类都需要一个 Companion 对象。
  • 将 Companion 对象用于其预期目的,例如存储常量、提供实用程序方法或创建单例对象。
  • 使用明确的名称来标识 Companion 对象,例如 Companion 或 Util。
  • 避免在 Companion 对象中放置与类实例无关的代码。

Companion 对象是 Kotlin 中一个强大的工具,它可以用来封装静态成员和方法。它们与静态成员不同,提供了一组独特的优势,包括单例访问、更严格的访问控制和与类的紧密集成。通过明智地使用 Companion 对象,您可以提高代码的可重用性、可读性和可维护性。