为什么一个对象不能有一个同伴对象?

时间:2020-10-30 10:13:09

标签: kotlin companion-object

我有一个object用于使用Spek的测试

object CodeTest : Spek({
  describe ("feature1") {
    it("has correct code") {
      assertTrue(123, 120 + 3)
    }
  }
})

我想初始化一些常量。

我不能只将常量转储到CodeTest的主体中:

object CodeTest : Spek({
  describe ("feature1") {
    it("has correct code") {
      assertTrue(ALL_GOOD, 120 + 3)
    }
  }
}) {
  private const val = ALL_GOOD = 123
}

因为它们将无法在我要使用它们的范围内使用。一个类的解决方案,以及总体上非常直接的解决方案,将是使用一个伴随对象:

object CodeTest : Spek({
  describe ("feature1") {
    it("has correct code") {
      assertTrue(ALL_GOOD, 120 + 3)
    }
  }
}) {
  companion object Codes {
    private const val ALL_GOOD = 123
  }
}

但是,编译器通知我无法将伴随对象添加到另一个对象。好的,我可以将我的对象更改为类,我想问题可以解决。

但是它仍然是一个单例。而且我也看不到任何同伴对象可以使一个对象成为 not 单例。那么为什么要实行这一限制呢?为什么必须是类才能使其具有伴随对象?

1 个答案:

答案 0 :(得分:1)

伴侣对象与Java中的类对象(类的静态成员)并不完全相似。对于您正在描述的用例,组织代码的典型方法是在类定义之外定义顶级属性/常量,该属性对文件是私有的。

private const val ALL_GOOD = 123

object CodeTest : Spek({
  describe ("feature1") {
    it("has correct code") {
      assertTrue(ALL_GOOD, 120 + 3)
    }
  }
})

即使您的类是class而不是object,对于私有常量,我仍然会采用这种方式。如果仅存储一些常量,则无需实例化一个单例。