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) {
}
}
中 的 每 一 个
同时 支持 这 两 种 方法 通常 是 好 的 做法 吗 ? 上面 的 代码 是 唯一 的 方法 吗 ?
1条答案
按热度按时间33qvvth11#
给定 的 代码 会 产生 一些 问题 。 特别 是 , 它 会 生成 两 个 带有 一 个 Object 参数 的 构造 函数 。 第 一 个 构造 函数 生成 的 字节 码 等价 于 :
中 的 每 一 个
第 二 个 生成 如下 :
格式
你 可以 通过 添加 一些 类型 来 解决 这个 问题 。 即使 groovy 有 动态 类型 , 方法 和 构造 函数 中 的 类型 声明 仍然 很 重要 。 例如 :
格式
至于 好 的 做法 , 我 会 简单 地 使用
groovy.transform.Canonical
或groovy.transform.TupleConstructor
注解 之 一 。 它们 将 自动 提供 正确 的 属性 Map 和 位置 参数 构造 函数 。 TupleConstructor 只 提供 构造 函数 , Canonical 应用 了 关于equals
、hashCode
和toString
的 一些 其他 最 佳 做法 。