静态方法和变量在Kotlin?

wbrvyc0a  于 2023-05-01  发布在  Kotlin
关注(0)|答案(4)|浏览(143)

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

public class Foo {
    private static Foo instance;

    public Foo() {
        if (instance == null) {
            instance = this;
        }
    }
    
    public static Foo get() {
        return instance;
    }
}
nfeuvbwi

nfeuvbwi1#

更新:任何人(比如OP)只要需要一个所谓的“Singleton”,有时也称为“Service”(Android除外),就应该简单地使用Kotlin的内置:

object Foo {
    // Done, this already does what OP needed,
    // because the boilerplate codes (like static field and constructor),
    // are taken care of by Kotlin.
}

(Like Roman在评论部分正确地指出。)
以前的答案;如果你有(或计划有)多个static变量,请继续阅读:
与Java的静态字段最接近的是伴随对象。您可以在这里找到它们的文档参考: www.example.com
你在Kotlin中的代码看起来像这样:

class Foo {

    companion object {
        private lateinit var instance: Foo

        fun get(): Foo {
            return instance;
        }
    }

    init {
        if (instance == null) {
            instance = this
        }
    }

}

如果你想让你的字段/方法对Java调用者公开为静态的,你可以应用@JvmStatic注解:

class Foo {

    companion object {
        private lateinit var instance: Foo

        @JvmStatic fun get(): Foo {
            return instance;
        }
    }

    init {
        if (instance == null) {
            instance = this
        }
    }

}

注意@JvmStatic不需要任何导入(因为它是Kotlin的内置功能)。

ctzwtxfj

ctzwtxfj2#

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

object Foo {
  ... 
}

所有带有静态字段和构造函数的样板代码都由Kotlin自动处理。你不用写这些。
在Kotlin代码中,您可以将此对象的示例简单地称为Foo。在Java代码中,您可以将此对象的示例引用为Foo.INSTANCE,因为Kotlin编译器会自动创建名为INSTANCE的相应静态字段。

vyu0f0g1

vyu0f0g13#

首先创建一个简单的类,然后创建一个块,然后使用同伴对象关键字
例如:

class Test{

    companion object{

        fun  getValue(): String{

           return "Test String"

        }
    }
}

你可以用类名点函数名来调用这个类函数
例如:

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

fnvucqvd4#

您可以为类创建一个伴随对象,如果您希望字段为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"
    }
}

相关问题