实现NULL对象模式



我找到了一个问题,它以某种方式在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)

相关内容

  • 没有找到相关文章

最新更新