2017-06-22 36 views
1

我试图确定,纯粹出于兴趣,是否有可能通过使用命名和默认构造函数参数完全删除在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中是不可能的,还是我还没有找到正确的语法?

由于提前,

西蒙

+0

我的一位朋友指出了一些名为* named argument constructor *的常规特性。它看起来不像kotlin完全对应的名为paramters,但它可能在某些情况下工作。 – glee8e

回答

0

这是可能的常规。例如:

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节:http://groovy-lang.org/objectorientation.html,它说,你可以有位置的构造函数或命名的构造函数之间进行选择。

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

如果你想要任何变量是强制性的,你将需要使用位置构造函数,它类似于直接java中的方式。

如果您为您的类定义了构造函数,那么您正在使用位置构造函数,并且不能再为该类使用命名参数构造函数。

+0

感谢您的回复。这与我之后的接近,我必须补充是groovy的一大特色。唯一的问题是所有的属性现在都是可选的。 – Simon

+0

啊,我明白了。我没有完全理解这个问题。让我研究并可能修改我的答案。 – switch201

+0

@Smion请看我的新编辑 – switch201

相关问题