object - Kotlin:类中对象和伴随对象之间的区别

kotlin 类中的对象和伴生对象有什么区别?

例子:

class MyClass {

    object Holder {
        //something
    }

    companion object {
        //something
    }
}

我已经读过,如果包含的参数/方法与其类密切相关,则应使用伴随对象。

但是为什么还有可能在类中声明一个普通对象呢?因为它的行为与同伴完全一样,但它必须有一个名字。

它的“静态”(我来自 java 端)生命周期是否可能有所不同?

最佳答案

object 有两种不同的用途,expressiondeclaration

对象表达式

当一个类需要稍微修改时,可以使用对象表达式,但没有必要为它创建一个全新的子类。匿名内部类就是一个很好的例子。

button.setOnClickListener(object: View.OnClickListener() {
    override fun onClick(view: View) {
        // click event
    }
})

需要注意的一点是匿名内部类可以从封闭范围访问变量,并且这些变量不必是final。这意味着在匿名内部类中使用的不被视为 final 的变量可能会在访问之前意外更改值。

对象声明

对象声明类似于变量声明,因此不能在赋值语句的右侧使用。对象声明对于实现单例模式非常有用。

object MySingletonObject {
    fun getInstance(): MySingletonObject {
        // return single instance of object
    }
}

然后可以像这样调用 getInstance 方法。

MySingletonObject.getInstance()

伴随对象

伴随对象是一种特定类型的对象声明,它允许对象的行为类似于其他语言(如 Java)中的静态对象。向对象声明添加 companion 允许向对象添加“静态”功能,即使 Kotlin 中不存在实际的静态概念。这是具有实例方法和伴随方法的类的示例。

class MyClass {
  companion object MyCompanionObject {
    fun actsAsStatic() {
      // do stuff
    }
  }
  
  fun instanceMethod() {
    // do stuff
  }
}

调用实例方法如下所示。

var myClass = MyClass()
myClass.instanceMethod()

调用伴随对象方法如下所示。

MyClass.actsAsStatic()

见 Kotlin docs了解更多信息。

https://stackoverflow.com/questions/43814616/

相关文章:

kotlin - Kotlin 中的 Getter 和 Setter

java - 为什么 Kotlin 中没有并发关键字?

algorithm - Kotlin - 从数组中删除重复字符串的惯用方法?

spring - 如何在kotlin中使用@Autowired之类的spring注解?

kotlin - 有什么作用? : do in Kotlin?(猫王运算符)

java - 是否可以在 Kotlin 中使用 Mockito?

kotlin - Kotlin 协程如何比 RxKotlin 更好?

kotlin - 如何从 Kotlin 的资源中读取文本文件?

kotlin - 在 Kotlin 中进行空检查的最佳方法?

database - Android Room Persistence 库和 Kotlin