我找到了一个问题,它以某种方式在kotlin中实现了空对象模式。我通常在Java中有些不同:
class MyClass {
static final MyClass INVALID = new MyClass();
public MyClass() {
// empty
}
}
以这种方式,我可以随时将MyClass.INVALID
用作null对象。
我该如何在kotlin中实现这种样式?
我摆弄了这样的东西:
data class MyClass(val id: Int) {
object INVALID: MyClass {
}
}
但甚至没有编译。
您可以通过使用companion object
来实现这一目标。因为可以通过简单地使用类名作为限定符来调用伴随对象的成员。你可以做;
data class MyClass(val id: Int) {
companion object {
@JvmStatic
val nullInstance = MyClass(0) //0 or any intended value
}
}
//invocation
val a = MyClass.nullInstance
val b = MyClass.nullInstance
print(a == b) //prints true because these are equavalent to Java's static instances.
在这里,我已经注释nullInstance
作为@JvmStatic
将其作为真实静态成员生成。
https://kotlinlang.org/docs/reference/object-declarations.html
您在正确的轨道上,您会遇到的问题是您不能从数据类中继承。
您可以重组代码以使用接口,类似的内容:
interface MyClass {
val id: Int
object INVALID : MyClass {
override val id: Int = -1
}
}
data class RealMyClass(override val id: Int) : MyClass
或具有可以从基础中继承的open class
,这为您提供了更多简洁的代码,因为您可以在null对象的情况下重复使用基类中声明的属性 - 您仍然必须覆盖它在您的数据类中,因为所有数据类构造函数参数都需要为属性。
open class MyClass(open val id: Int) {
object INVALID : MyClass(-1)
}
data class RealMyClass(override val id: Int) : MyClass(id)