【问题标题】:Groovy named and default argumentsGroovy 命名参数和默认参数
【发布时间】:2011-11-16 22:44:13
【问题描述】:

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) {
    }

}

同时支持两者通常是一种好习惯吗?上面的代码是唯一的方法吗?

【问题讨论】:

    标签: groovy arguments argument-passing


    【解决方案1】:

    给定的代码会导致一些问题。特别是,它将生成两个带有单个 Object 参数的构造函数。第一个构造函数生成的字节码相当于:

    A() // a,b both default
    A(Object) // a set, b default
    A(Object, Object) // pass in both
    

    第二个生成这个:

    A(Object) // accepts any object
    

    您可以通过添加一些类型来解决这个问题。尽管 groovy 具有动态类型,但方法和构造函数中的类型声明仍然很重要。例如:

    A(int a = 1, String b = "str") { ... }
    A(Map args) { ... }
    

    至于好的做法,我会简单地使用groovy.transform.Canonicalgroovy.transform.TupleConstructor 注释之一。它们将自动提供正确的属性映射和位置参数构造函数。 TupleConstructor 仅提供构造函数,Canonical 对equalshashCodetoString 应用了一些其他最佳实践。

    【讨论】:

    猜你喜欢
    • 2013-08-02
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多