Aym*_*man 5 groovy arguments argument-passing
Groovy支持默认和命名参数.我只是看不到他们一起工作.
我需要一些类来支持使用简单的非命名参数进行构造,并使用如下所示的命名参数:
def a1 = new A(2)
def a2 = new A(a: 200, b: "non default")
class A extends SomeBase {
def props
A(a=1, b="str") {
_init(a, b)
}
A(args) {
// use the values in the args map:
_init(args.a, args.b)
props = args
}
private _init(a, b) {
}
}
Run Code Online (Sandbox Code Playgroud)
通常是同时支持两者的好习惯吗?上面的代码是唯一的方法吗?
给定的代码会导致一些问题.特别是,它将生成两个带有单个Object参数的构造函数.第一个构造函数生成等效于的字节码:
A() // a,b both default
A(Object) // a set, b default
A(Object, Object) // pass in both
Run Code Online (Sandbox Code Playgroud)
第二个产生这个:
A(Object) // accepts any object
Run Code Online (Sandbox Code Playgroud)
您可以通过添加一些类型来解决此问题.尽管groovy具有动态类型,但方法和构造函数中的类型声明仍然很重要.例如:
A(int a = 1, String b = "str") { ... }
A(Map args) { ... }
Run Code Online (Sandbox Code Playgroud)
至于良好实践,我只使用其中一个groovy.transform.Canonical或groovy.transform.TupleConstructor注释.它们将自动提供正确的属性映射和位置参数构造函数.TupleConstructor只提供构造,典型应用一些其他最佳实践与问候equals,hashCode和toString.