gpt4 book ai didi

Groovy 命名和默认参数

转载 作者:行者123 更新时间:2023-12-04 18:49:58 35 4
gpt4 key购买 nike

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

}

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

最佳答案

给定的代码会导致一些问题。特别是,它将生成两个带有单个 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.Canonical 之一。或 groovy.transform.TupleConstructor 注释。它们将自动提供正确的属性映射和位置参数构造函数。 TupleConstructor 仅提供构造函数,Canonical 应用了一些其他关于 equals 的最佳实践。 , hashCode , 和 toString .

关于Groovy 命名和默认参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7415499/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com