kotlin 类中的对象和伴生对象有什么区别?
例子:
class MyClass {
object Holder {
//something
}
companion object {
//something
}
}
我已经读过,如果包含的参数/方法与其类密切相关,则应使用伴随对象。
但是为什么还有可能在类中声明一个普通对象呢?因为它的行为与同伴完全一样,但它必须有一个名字。
它的“静态”(我来自 java 端)生命周期是否可能有所不同?
最佳答案
object
有两种不同的用途,expression 和 declaration。
对象表达式
当一个类需要稍微修改时,可以使用对象表达式,但没有必要为它创建一个全新的子类。匿名内部类就是一个很好的例子。
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/