Kotlin静态方法和变量

Kotlin静态方法和变量,kotlin,Kotlin,我希望能够将一个类实例保存到一个公共静态变量中,但我不知道如何在Kotlin中实现这一点 class Foo { public static Foo instance; public Foo() { instance = this; } } 最接近Java静态字段的是一个伴生对象。您可以在此处找到他们的文档参考: Kotlin中的代码如下所示: class Foo { companion object { lateinit

我希望能够将一个类实例保存到一个公共静态变量中,但我不知道如何在Kotlin中实现这一点

class Foo {

    public static Foo instance;
    public Foo() {
        instance = this;
    }

}

最接近Java静态字段的是一个伴生对象。您可以在此处找到他们的文档参考:

Kotlin中的代码如下所示:

class Foo {

    companion object {
        lateinit var instance: Foo
    }

    init {
        instance = this
    }

}
如果希望字段/方法以静态方式公开给Java调用方,可以应用注释:

class Foo {

    companion object {
        @JvmStatic lateinit var instance: Foo
    }

    init {
        instance = this
    }

}

首先创建一个简单的类,然后创建一个块,后跟伴随对象关键字

例如:

class Test{

    companion object{

        fun  getValue(): String{

           return "Test String"

        }
    }
}
您可以使用类名dot function name调用这个类函数

例如:

// here you will get the function value
Test.getValue() 

您可以为类创建一个伴生对象,如果希望字段是
static
,可以使用注释@JvmStatic。Companion对象可以访问它作为Companion对象的类的私有成员

请参见下面的示例:

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"
    }
}

看起来您想要定义一个单例对象。它在Kotlin中作为一流概念得到支持:

object Foo {
  ... 
}
所有带有静态字段和构造函数的样板代码都由Kotlin自动处理。你不必写这些


从Kotlin代码中,您可以将此对象的实例简单地称为
Foo
。从Java代码中,您可以将此对象的实例引用为
Foo.instance
,因为Kotlin编译器会自动创建名为
instance

的相应静态字段。但我觉得这很糟糕。为什么要使用可变静态字段(已经是一种糟糕的做法),并在每次构造Foo实例时对其进行修改?你想实现什么?如果你想创建一个单例,请查看。使用
伴生对象
来声明
实例
字段是一个样板文件,如果你简单地将
Foo
声明为
对象Foo{…}
这是更好的解决方案,然而,对于我的用例,我需要一个类,因为它需要能够由Java类加载器创建。