Kotlin静态方法和变量


78

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

class Foo {

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

}

7
kotlinlang.org/docs/reference/classes.html#companion-objects。但这对我来说太可怕了。为什么要使用可变的静态字段(已经是不好的做法),并且每次构造Foo实例时都要对其进行修改?您想达到什么目的?
JB Nizet

3
如果要创建单例,请查看kotlinlang.org/docs/reference/…
Miha_x64 '17

Answers:


121

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

}

12
如果您简单地声明为companion objectinstanceFooobject Foo { ... }
Roman Elizarov

47

看来您要定义一个单例对象。Kotlin支持它作为一流的概念:

object Foo {
  ... 
}

Kotlin会自动处理所有带有静态字段和构造函数的样板代码。您无需编写任何内容。

从Kotlin代码中,您可以简单地以引用该对象的实例Foo。在Java代码中,您可以引用该对象的实例Foo.INSTANCE,因为Kotlin编译器会自动创建名为的相应静态字段INSTANCE


这是更好的解决方案,但是,对于我的用例,我需要一个类,因为它需要能够由Java类加载器创建。
Caleb Bassham

8

首先,您创建一个简单的类,然后在创建一个块后再添加伴随对象关键字

例如:

class Test{

    companion object{

        fun  getValue(): String{

           return "Test String"

        }
    }
}

您可以使用类名点函数名来调用该类函数

例如:

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

1

您可以为该类创建一个伴随对象,如果希望该字段为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"
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.