我希望能够将类实例保存到公共静态变量中,但是我不知道如何在Kotlin中做到这一点。
class Foo {
public static Foo instance;
public Foo() {
instance = this;
}
}
我希望能够将类实例保存到公共静态变量中,但是我不知道如何在Kotlin中做到这一点。
class Foo {
public static Foo instance;
public Foo() {
instance = this;
}
}
Answers:
与Java的静态字段最接近的是伴随对象。您可以在这里找到有关它们的文档参考:https : //kotlinlang.org/docs/reference/object-declarations.html#companion-objects
您在Kotlin中的代码如下所示:
class Foo {
companion object {
lateinit var instance: Foo
}
init {
instance = this
}
}
如果希望将字段/方法作为静态内容公开给Java调用者,则可以应用@JvmStatic
批注:
class Foo {
companion object {
@JvmStatic lateinit var instance: Foo
}
init {
instance = this
}
}
companion object
instance
Foo
object Foo { ... }
看来您要定义一个单例对象。Kotlin支持它作为一流的概念:
object Foo {
...
}
Kotlin会自动处理所有带有静态字段和构造函数的样板代码。您无需编写任何内容。
从Kotlin代码中,您可以简单地以引用该对象的实例Foo
。在Java代码中,您可以引用该对象的实例Foo.INSTANCE
,因为Kotlin编译器会自动创建名为的相应静态字段INSTANCE
。
首先,您创建一个简单的类,然后在创建一个块后再添加伴随对象关键字
例如:
class Test{
companion object{
fun getValue(): String{
return "Test String"
}
}
}
您可以使用类名点函数名来调用该类函数
例如:
// here you will get the function value
Test.getValue()
您可以为该类创建一个伴随对象,如果希望该字段为static
您可以使用批注@JvmStatic。伴随对象可以访问与其伴随的类的私有成员。
参见以下示例:
class User {
private lateinit var name: String
override fun toString() = name
companion object {
@JvmStatic
val instance by lazy {
User().apply { name = "jtonic" }
}
}
}
class CompanionTest {
@Test
fun `test companion object`() {
User.instance.toString() shouldBe "jtonic"
}
}