【问题标题】:Why not implement singleton pattern for the NULL object in Kotlin?为什么不在 Kotlin 中为 NULL 对象实现单例模式?
【发布时间】:2020-02-06 22:33:12
【问题描述】:
class Foo(val param1: String, var param2: Int) {
        // class body

        companion object {
                val NULL = Foo("", 0)
        }
}

NULL 对象在 Kotlin 中有效吗?

虽然 Kotlin 允许在构造函数中添加默认值,但是否有理由不鼓励使用 NULL 对象,就像上面的 sn-p 一样?

假设我不需要只使用一个参数来构造对象,例如:Foo("ABC") 或 Foo(5)。 (...在将 Foo 修改为在构造函数中具有默认值之后)

https://sourcemaking.com/design_patterns/null_object

【问题讨论】:

  • 当然 null 对象是有效的,就像任何其他设计模式一样。是否要将空对象存储为单例并在编写Foo()时返回?
  • 我认为 null 模式仅适用于私有构造函数和静态工厂或构建器,它们将为 null 参数返回该对象并阻止用户手动创建它的更多副本。

标签: kotlin null-object-pattern


【解决方案1】:

Singleton 并不适合描述您所拥有的东西。单例是只允许一个实例的类。这只是一个可以具有多个实例的类的全局可访问实例。

我建议不要将其称为 NULL,因为在 Kotlin 中 null 一词的含义。可能相当具有误导性。也许叫它EMPTY

这是否是一种不好的做法取决于您如何使用它,但保留一些长期存在的类实例本身并没有错。

但是,我会避免对这样的可变类执行此操作。这暗示它是一个常数,但在您的示例中,有人可以从应用程序中的任何位置更改 NULL.param2 的值,并在其他地方破坏依赖其值为 0 的代码。

【讨论】:

    【解决方案2】:

    空对象是有效的 Kotlin 设计模式。

    当你使用这个模式时,你应该创建一个接口并让常规类和空对象都实现它。此外,null 对象应该像所有其他单例一样是不可变的。

    以下是在 Kotlin 中实现空对象设计模式的方法:

    interface Foo {
        val param1: String
        val param2: Int
    }
    
    object NullFoo : Foo {
        override val param1: String get() = ""
        override val param2: Int get() = 0
    }
    
    class FooImpl(override val param1: String, override var param2: Int) : Foo
    

    或者,您可以将实际的 null 值和扩展函数(属性)用于可为空的接收器:

    class Foo(val param1: String, var param2: Int)
    
    val Foo?.param1: String get() = this?.param1 ?: ""
    val Foo?.param2: Int get() = this?.param2 ?: 0
    

    【讨论】:

      【解决方案3】:

      你可以创建一个不带参数的工厂函数,它会返回一个空对象:

      class Foo(val param1: String, var param2: Int) {
              // class body
      }
      
      private val nullFoo = Foo("", 0)
      
      fun Foo() = nullFoo
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-26
        • 2019-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多