【问题标题】:Kotlin - any substitute for companion object inside of another object (not class)?Kotlin - 可以替代另一个对象(不是类)内的伴随对象吗?
【发布时间】:2017-11-27 07:44:28
【问题描述】:

我希望在我的 Kotlin Android 应用程序中拥有单例对象,并对其内部状态进行一些静态定义。

据我了解,Kotlin 中的object 是针对单例的,所以我正在尝试这种方法:

object MySingleton
{
    public const val _DEF_DEFINITION_NO_ONE: Byte = 1;
    public const val _DEF_DEFINITION_NO_TWO: Byte = 2;
    (...)
}

这很好,但问题是,为了能够使用这些定义,现在我必须先创建 Object 的实例。

只是想知道我是否能够在 Kotlin 中创建这种结构并在不创建 MySingleton 实例的情况下访问这些定义?答案是 companion object 与其他语言中的 static 工作方式相似,但不允许在对象内部,只能在类内部。

当然,我可以保持原样或将这些定义设为全局,但想知道是否可以按照我描述的方式进行操作?或者也许我应该以另一种方式设计它?

【问题讨论】:

  • now I must create Object's instance first 成功了吗?
  • @voddan 我是这么认为的,因为我在主要活动中使用了这个:private var myPrivateVar: MySingleton = MySingleton,它并没有导致语法错误。似乎在这种情况下它只是复制参考,或者类似的东西。抱歉,我还是 Kotlin 的新手。
  • 我明白了。由于任何实例初始化都是一个动作,它总是需要像函数调用MyClass() 这样的大括号。这就是您知道调用构造函数并创建对象的方式。

标签: android design-patterns kotlin


【解决方案1】:

在 Kotlin 中有两种处理静态数据的方法:

object

object ASingleton {
    val CONSTANT_PROPERTY: Int = 1;
}

如果您需要一个实例类,每个属性只有一个状态,请使用单例。注意:这个类只能有一个实例,它是由编译器为你创建的。

一个带有companion object的类

class ClassWithCompanionObject{

    val someProperty: Int = 0; // instance bound

    companion object {
        val CONSTANT_PROPERTY: Int = 1;
    }
}

如果您需要一些静态属性,而其余的应该具有绑定到某个实例的状态,请使用带有companion object 的类。

用法:

println(ASingleton.CONSTANT_PROPERTY)
println(ClassWithCompanionObject.CONSTANT_PROPERTY)

【讨论】:

    【解决方案2】:

    正如你所说,MySingleton 是一个object,因此是一个单例。无需创建它的实例(甚至不可能)。您只需像这样以静态方式访问它的常量:MySingleton._DEF_DEFINITION_NO_ONE

    如果您想在不使用 object 名称前缀的情况下使用常量,只需使用完全限定名称导入它们并按如下方式使用:

    import package.MySingleton._DEF_DEFINITION_NO_ONE
    //...
    println(_DEF_DEFINITION_NO_ONE)
    

    【讨论】:

    • 我可以在不初始化对象本身的情况下使用常量吗?假设我的object 初始化起来很繁重,因此我在需要时懒惰地做它。但我想访问静态字段。能做到吗?
    • 如果声明为object,编译器将负责创建它。运行时只有一个实例。在创建对象之前,您无法访问这些常量,因为始终会创建对象
    • @garbus 如果您打算在对象的 init 块中进行繁重的工作,请不要这样做。一般来说,在类实例化/对象创建期间不应该这样做。但无论如何,这些字段应该是可访问的,正如 Simon 和我所展示的那样。
    • 啊,所以编译器会自动为我创建这个实例。不知道。感谢清理。
    • 发生在生成的字节码中(准确的说)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    • 2016-05-21
    • 1970-01-01
    相关资源
    最近更新 更多