我有一个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 单例。那么为什么要实行这一限制呢?为什么必须是类才能使其具有伴随对象?
答案 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
,对于私有常量,我仍然会采用这种方式。如果仅存储一些常量,则无需实例化一个单例。