将强制和任意可选构造函数参数与Groovy相结合

将强制和任意可选构造函数参数与Groovy相结合,groovy,jvm,kotlin,Groovy,Jvm,Kotlin,纯粹出于兴趣,我试图确定是否可以通过使用命名和默认构造函数参数来完全消除在Groovy中使用构建器模式的需要;也就是说,只使用内置的语言特性来解决伸缩构造函数的问题 例如,在Kotlin中,可以执行以下操作: data class Thing(val mandatory1: Int, val mandatory2: Int, val optional1: Int = 100, val optional2: Int =

纯粹出于兴趣,我试图确定是否可以通过使用命名和默认构造函数参数来完全消除在Groovy中使用构建器模式的需要;也就是说,只使用内置的语言特性来解决伸缩构造函数的问题

例如,在Kotlin中,可以执行以下操作:

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(1, 2, optional2 = 4),
屈服

Thing(mandatory1=1, mandatory2=2, optional1=100, optional2=4, nullable=null)
请注意,我可以设置optional2,而无需设置optional1。我不确定这在Groovy中是否可行,但我还是远远不是专家

有趣的是,通过查看生成的字节码,Kotlin编译器似乎会生成一个构造函数,然后重写实例化语句,以便在参数列表中的正确位置传递可选参数

那么,对于Groovy专家来说,这在Groovy中是不可能的,还是我还没有找到正确的语法

提前感谢,


Simon

这在groovy中是可能的。例如:

Class Thing{
    def x
    def y
    def z = 5
}
在这一点上,你甚至不需要一个构造函数,如果你计划做的只是赋值的话。你可以说:

new Thing(x: "Hello", y:"World", z:6) //if you want to overwrite the defualt value of z.
如果您阅读了本文档的第1.4节:,它说明您可以在具有位置构造函数或命名构造函数之间进行选择

我的例子是使用命名参数构造函数,它为调用构造函数的人提供了更多的能力

如果希望任何变量都是强制性的,则需要使用位置构造函数,这类似于在纯java中的实现方式


如果为类定义构造函数,则使用的是位置构造函数,不能再为该类使用命名参数构造函数。

这在groovy中是可能的。例如:

Class Thing{
    def x
    def y
    def z = 5
}
在这一点上,你甚至不需要一个构造函数,如果你计划做的只是赋值的话。你可以说:

new Thing(x: "Hello", y:"World", z:6) //if you want to overwrite the defualt value of z.
如果您阅读了本文档的第1.4节:,它说明您可以在具有位置构造函数或命名构造函数之间进行选择

我的例子是使用命名参数构造函数,它为调用构造函数的人提供了更多的能力

如果希望任何变量都是强制性的,则需要使用位置构造函数,这类似于在纯java中的实现方式


如果为类定义构造函数,则使用的是位置构造函数,不能再为该类使用命名参数构造函数。

我的一个朋友向我指出了一些名为命名参数构造函数的groovy功能。它看起来不像是kotlin命名参数的完全对应项,但在某些情况下可能会起作用。它看起来不像kotlin命名参数的完全对应项,但在某些情况下可能会起作用。谢谢您的回复。这接近于我所追求的,我必须补充的是groovy的一个伟大特性。唯一的问题是所有属性现在都是可选的。啊,我明白了。我没有完全理解这个问题。让我研究一下,并可能修改我的答案。谢谢@switch201。我读了那份文件,得出了同样的结论。我仍然认为Groovy很棒;这是我提出的一个非常挑剔的问题。谢谢你的回答。这接近于我所追求的,我必须补充的是groovy的一个伟大特性。唯一的问题是所有属性现在都是可选的。啊,我明白了。我没有完全理解这个问题。让我研究一下,并可能修改我的答案。谢谢@switch201。我读了那份文件,得出了同样的结论。我仍然认为Groovy很棒;这是我提出的一个非常挑剔的观点。