实现空对象模式
Implement null object pattern
我发现 它以某种方式在 Kotlin 中实现了空对象模式。我通常在 Java:
中做一些不同的事情
class MyClass {
static final MyClass INVALID = new MyClass();
public MyClass() {
// empty
}
}
这样我就可以一直用MyClass.INVALID
作为空对象
如何在 Kotlin 中实现这种风格?
我摆弄过这样的东西:
data class MyClass(val id: Int) {
object INVALID: MyClass {
}
}
但这甚至无法编译。
你走在正确的轨道上,你将遇到的问题是你无法从数据继承 class。
您可以重组代码以使用接口,如下所示:
interface MyClass {
val id: Int
object INVALID : MyClass {
override val id: Int = -1
}
}
data class RealMyClass(override val id: Int) : MyClass
或者有一个可以从中继承的open class
作为基础,这给了你更简洁的代码,因为你可以重用在基础class中声明的属性空对象 - 您仍然需要在数据 class 中覆盖它,因为所有数据 class 构造函数参数都需要是属性。
open class MyClass(open val id: Int) {
object INVALID : MyClass(-1)
}
data class RealMyClass(override val id: Int) : MyClass(id)
实现此目的的一种方法是使用 companion object
。因为可以通过简单地使用 class 名称作为限定符来调用伴生对象的成员。你可以做到;
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
我发现
class MyClass {
static final MyClass INVALID = new MyClass();
public MyClass() {
// empty
}
}
这样我就可以一直用MyClass.INVALID
作为空对象
如何在 Kotlin 中实现这种风格?
我摆弄过这样的东西:
data class MyClass(val id: Int) {
object INVALID: MyClass {
}
}
但这甚至无法编译。
你走在正确的轨道上,你将遇到的问题是你无法从数据继承 class。
您可以重组代码以使用接口,如下所示:
interface MyClass {
val id: Int
object INVALID : MyClass {
override val id: Int = -1
}
}
data class RealMyClass(override val id: Int) : MyClass
或者有一个可以从中继承的open class
作为基础,这给了你更简洁的代码,因为你可以重用在基础class中声明的属性空对象 - 您仍然需要在数据 class 中覆盖它,因为所有数据 class 构造函数参数都需要是属性。
open class MyClass(open val id: Int) {
object INVALID : MyClass(-1)
}
data class RealMyClass(override val id: Int) : MyClass(id)
实现此目的的一种方法是使用 companion object
。因为可以通过简单地使用 class 名称作为限定符来调用伴生对象的成员。你可以做到;
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