【问题标题】:Kotlin static methods and variablesKotlin 静态方法和变量
【发布时间】:2017-10-07 01:21:50
【问题描述】:

我希望能够将类实例保存到公共静态变量中,但我不知道如何在 Kotlin 中执行此操作。

class Foo {

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

}

【问题讨论】:

标签: kotlin


【解决方案1】:

与 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 编译器会自动处理它
【解决方案2】:

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

object Foo {
  ... 
}

所有带有静态字段和构造函数的样板代码都由 Kotlin 自动处理。你不必写任何东西。

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

【讨论】:

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

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

例如:

class Test{

    companion object{

        fun  getValue(): String{

           return "Test String"

        }
    }
}

你可以使用类名点函数名来调用这个类函数

例如:

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

【讨论】:

    【解决方案4】:

    您可以为该类创建一个伴随对象,如果您希望该字段为static,您可以使用注解@JvmStatic。 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"
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多