是否可以在编译时验证是否为 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()
}