Kotlin:一个类中的对象和伴侣对象之间的区别

kotlin中的一个对象和同伴对象之间有什么区别?

例:

class MyClass { object Holder { //something } companion object { //something } } 

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

但是为什么还有在班上宣布一个正常的对象的可能性呢? 因为它的行为完全像伴侣,但它必须有一个名字。

在它的“静态”(我来自Java方面)生命周期中可能有不同吗?

对象可以实现接口。 在类中,定义一个不实现任何接口的简单对象在大多数情况下都没有好处。 但是,定义实现各种接口的多个对象(如Comparator )可能非常有用。

就生命周期而言,伴随对象与在类中声明的命名对象没有区别。

有两种不同类型的object使用, 表达式声明

对象表达

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

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

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

对象声明

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

 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文档 。

Companion对象的存在,因为你可以调用伴侣对象的功能/属性,就像它是一个Java静态方法/字段。 而为了你的Holder被允许,没有理由声明一个嵌套的对象是非法的。 有时可能会派上用场。