class MyClass {
companion object Factory {
fun create(): MyClass = MyClass()
}
}
可以省略陪伴对象的名称,在这种情况下,将使用名称companion
:
但是,我看到的示例中没有使用同伴对象的名称。
因为每个类只能有一个同伴对象(否则会得到每个类只允许一个同伴对象
错误),所以这个名称对我来说就像是一些非常没用的语法糖。
您可以使用同伴的名称,如:
MyClass.create() // not via companion name
MyClass.Companion.create() // via default companion name
MyClass.Factory.create() // via companion name
名称对于Kotlin来说可能不是那么重要,因为您可以访问该方法,而不知道有一个伴生对象(上面的第1行)。它更像是一种个人风格,如果你想让对这类函数的访问更加明确的话。
但对于java interop来说,它有很大的区别,因为您必须通过附带名称来访问函数:
MyClass.Factory.create(); // with named companion
MyClass.Companion.create(); // with unnamed comanion
为了Android的开发,我从Java切换到kotlin。当我在Kotlin中搜索Java静态方法的等价时,我发现同伴对象是。但问题是在Kotlin中创建多个静态方法时。我得到了这些错误,每个类只允许一个伴随对象。
在Kotlin中,如果我在同伴对象中有一个以作为前缀()的函数,那么与同伴对象中的相比会有什么不同呢? 我注意到,在下面的代码中,将使它对外部作用域不可见,但对同一同伴对象内部的函数仍然可见。 您可以在:https://pl.kotl.in/T6FVM6NI6找到代码片段 还有其他区别吗?和除了可见性之外是否相同?这是将方法封装在陪伴对象中的一种方法吗?
然而,在同伴对象中使用apply时,我遇到了一个奇怪的意外错误。如果我在a的伙伴对象的函数中使用,我会得到一个错误,这很奇怪,因为我直接对对象的实例调用apply,因此希望我始终能够访问它的公共属性。更不用说,似乎伴侣对象不能设置为,因此错误消息中的建议没有太大帮助。 下面是完整的示例代码: 这是怎么回事?我做错了什么?
Kotlin代码是这样的: 可以简单地更改为 我知道同伴对象可以用来作为真正的java静态函数使用,但是使用同伴对象还有其他的优点吗?
我想知道是否可以在同伴对象中使用类的属性。例如,以贝娄为例: 我不能通过c1或C2调用changeAge()函数。我可以使用changeAge的唯一地方是通过Person1.changeAge(),当Person1还没有用适当的构造函数实例化时。我想知道这些动作是不是有其他的选择,或者是没有,有同伴对象有什么意义呢
所以我有下面的代码,用Kotlin写的。 我在最后一条指令行()上得到一个编译错误,编译器说,但我不知道为什么。 我认为同伴对象应该对它们“陪伴”的类的属性具有某种可见性。 (免责声明:此代码正在从Java迁移到Kotlin。在Java版本上,以前是同一个类上的静态方法。) 多谢!