正在验证构造函数中的值组合



我正在尝试创建一个类Box<T>。它应该有两个公共的不可变(val(属性,isContentMandatory: Booleancontent: T?。这是我想要接受的值的组合:

是//tr>是//tr>
isContentMandatory 内容是否允许
false null
false 非null
null
true 非null

如果没有用例的实际领域知识,很难回答这是否是一种解决问题的好方法,但在我看来,制作一个单独的类来建模那些带有布尔值(否则毫无意义?(的用例是没有意义的。

你可以有两个类BoxWithOptionalcontent<T>并且BoxWithContent<T>对于这两个afaict,您只需要一个默认构造函数。

sealed interface Box<T: Any?> {
abstract val content: T?
}
data class BoxWithContent<T: Any>(override val content: T): Box<T>
data class BoxWithOptionalContent<T: Any?>(override val content: T? = null): Box<T?>

这在初始化站点上应该不会有太大变化,在使用方面,您可能需要添加一个case语句来决定它是哪种情况并进行适当处理。但无论如何,您可能已经有了一些类似的逻辑,这可能会更加类型安全和可读。

从您的Java方法来看,您似乎只是想要一个运行时检查,而不是真正防止错误调用。只要有默认参数和一个init块来验证就可以了:

class Box(val content: T? = null, val isContentMandatory: Boolean = false)
init {
if(content == null && isContentMandatory)
throw RuntimeException("Cannot have no content if content is mandatory")
}
}

作为第一个参数给出的任何内容都是有效的,因此要实现这一突破,您必须更努力地显式使用Box(isContentMandatory=true)Box(null, true)

最新更新