Kotlin:对象与同伴对象之间的区别

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

例:

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

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

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

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

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

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

有两种不同types的object使用, expression式声明

对象expression

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

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

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

对象声明

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

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

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

 MySingletonObject.getInstance() 

伴侣对象

伴随对象是一种特定types的对象声明,它允许对象与其他语言(如Java)中的静态对象类似。 将companion添加到对象声明允许将“静态”function添加到对象,即使Kotlin中不存在实际的静态概念。 下面是一个带有实例方法和伴随方法的类的例子。

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

调用实例方法看起来像这样。

 var myClass = MyClass() myClass.instanceMethod() 

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

 MyClass.actsAsStatic() 

查看移动信息的Kotlin文档 。

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

对象或对象声明,在第一次访问时会被懒惰地初始化。

伴随对象在加载相应的类时被初始化。 它带来了“静态”的本质,尽管Kotlin本质上并不支持静态成员。