是否可以在编译时验证是否为 Kotlin 中的 Factory Class 调用了所需的函数?
Is it possible to verify at compile time whether the required function is called for the Factory Class in Kotlin?
class ModelFactory {
fun setA() : ModelFactory {
// blabla...
}
fun setB() : ModelFactory {
// blabla...
}
fun setC() : ModelFactory {
// blabla...
}
fun build() : Model {
// An error occurs if any of setA, setB, and setC is not called.
}
}
//example
fun successTest() {
ModelFactory().setA().setB().setC().build() // No error occurs at compile time
}
fun failTest() {
ModelFactory().setA().build() // An error occurs at compile time because setB and setC are not called.
}
语法上有点别扭,但我觉得已经表达了我的意思
我已经为这个需求实现了一个错误引发的运行时,但我想在编译时检查这个。
如果可能的话,我想我应该使用注释。但这在编译时真的可能吗?
使用 Kotlin,我一直在避免构建器模式,因为我们总是可以为 non-mandatory 个字段指定默认值。
如果您仍想使用构建器模式,可以使用步骤构建器模式,该模式要求在创建对象之前设置所有必填字段。注意每个setter方法returns下一个setter接口的引用。根据必填字段的组合,您可以有多个步骤构建器。
class Model(val a: String = "", val b: String = "", val c: String = "")
class StepBuilder {
companion object {
fun builder(): AStep = Steps()
}
interface AStep {
fun setA(a: String): BStep
}
interface BStep {
fun setB(b: String): CStep
}
interface CStep {
fun setC(c: String): BuildStep
}
interface BuildStep {
//fun setOptionalField(x: String): BuildStep
fun build(): Model
}
class Steps : AStep, BStep, CStep, BuildStep {
private lateinit var a: String
private lateinit var b: String
private lateinit var c: String
override fun setA(a: String): BStep {
this.a = a
return this
}
override fun setB(b: String): CStep {
this.b = b
return this
}
override fun setC(c: String): BuildStep {
this.c = c
return this
}
override fun build() = Model(a, b , c)
}
}
fun main() {
// cannot build until you call all three setters
val model = StepBuilder.builder().setA("A").setB("B").setC("C").build()
}
class ModelFactory {
fun setA() : ModelFactory {
// blabla...
}
fun setB() : ModelFactory {
// blabla...
}
fun setC() : ModelFactory {
// blabla...
}
fun build() : Model {
// An error occurs if any of setA, setB, and setC is not called.
}
}
//example
fun successTest() {
ModelFactory().setA().setB().setC().build() // No error occurs at compile time
}
fun failTest() {
ModelFactory().setA().build() // An error occurs at compile time because setB and setC are not called.
}
语法上有点别扭,但我觉得已经表达了我的意思
我已经为这个需求实现了一个错误引发的运行时,但我想在编译时检查这个。
如果可能的话,我想我应该使用注释。但这在编译时真的可能吗?
使用 Kotlin,我一直在避免构建器模式,因为我们总是可以为 non-mandatory 个字段指定默认值。
如果您仍想使用构建器模式,可以使用步骤构建器模式,该模式要求在创建对象之前设置所有必填字段。注意每个setter方法returns下一个setter接口的引用。根据必填字段的组合,您可以有多个步骤构建器。
class Model(val a: String = "", val b: String = "", val c: String = "")
class StepBuilder {
companion object {
fun builder(): AStep = Steps()
}
interface AStep {
fun setA(a: String): BStep
}
interface BStep {
fun setB(b: String): CStep
}
interface CStep {
fun setC(c: String): BuildStep
}
interface BuildStep {
//fun setOptionalField(x: String): BuildStep
fun build(): Model
}
class Steps : AStep, BStep, CStep, BuildStep {
private lateinit var a: String
private lateinit var b: String
private lateinit var c: String
override fun setA(a: String): BStep {
this.a = a
return this
}
override fun setB(b: String): CStep {
this.b = b
return this
}
override fun setC(c: String): BuildStep {
this.c = c
return this
}
override fun build() = Model(a, b , c)
}
}
fun main() {
// cannot build until you call all three setters
val model = StepBuilder.builder().setA("A").setB("B").setC("C").build()
}