我试图确定,纯粹出于兴趣,是否有可能通过使用命名和默认构造函数参数完全删除在Groovy中使用Builder模式的需要;也就是说,只使用内置的语言特征来解决伸缩构造问题。将强制和任意可选构造函数参数与Groovy结合使用
例如,在科特林,能够执行以下操作:
data class Thing(val mandatory1: Int,
val mandatory2: Int,
val optional1: Int = 100,
val optional2: Int = 200,
val nullable: Int? = null)
fun main(args: Array<String>) {
val things = listOf(
Thing(1, 2),
Thing(1, 2, 3),
Thing(1, 2, 3, 4),
Thing(1, 2, 3, 4, 5),
Thing(1, 2, optional2 = 4),
Thing(1, 2, optional1 = 4),
Thing(1, 2, nullable = 4),
Thing( nullable=400,
mandatory1 = 800,
optional1 = 300,
optional2 = 700,
mandatory2 = 600))
things.forEach { t -> println(t) }
}
这产生以下输出:
Thing(mandatory1=1, mandatory2=2, optional1=100, optional2=200, nullable=null)
Thing(mandatory1=1, mandatory2=2, optional1=3, optional2=200, nullable=null)
Thing(mandatory1=1, mandatory2=2, optional1=3, optional2=4, nullable=null)
Thing(mandatory1=1, mandatory2=2, optional1=3, optional2=4, nullable=5)
Thing(mandatory1=1, mandatory2=2, optional1=100, optional2=4, nullable=null)
Thing(mandatory1=1, mandatory2=2, optional1=4, optional2=200, nullable=null)
Thing(mandatory1=1, mandatory2=2, optional1=100, optional2=200, nullable=4)
Thing(mandatory1=800, mandatory2=600, optional1=300, optional2=700, nullable=400)
特别感兴趣的行是其中:
Thing(1, 2, optional2 = 4),
收益率
Thing(mandatory1=1, mandatory2=2, optional1=100, optional2=4, nullable=null)
注意,我能够设置optional2没有有过设置optional1。我不确定这在Groovy中是可能的,但是,我再次远离专家。
作为感兴趣的一点,查看生成的字节码,Kotlin编译器似乎生成一个构造函数,然后重写实例化语句以在参数列表中的正确位置传递可选参数。
因此,对于Groovy专家来说,这在Groovy中是不可能的,还是我还没有找到正确的语法?
由于提前,
西蒙
我的一位朋友指出了一些名为* named argument constructor *的常规特性。它看起来不像kotlin完全对应的名为paramters,但它可能在某些情况下工作。 – glee8e