Groovy命名参数和默认参数

xnifntxz  于 2022-11-21  发布在  其他
关注(0)|答案(1)|浏览(150)

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

}

中 的 每 一 个
同时 支持 这 两 种 方法 通常 是 好 的 做法 吗 ? 上面 的 代码 是 唯一 的 方法 吗 ?

33qvvth1

33qvvth11#

给定 的 代码 会 产生 一些 问题 。 特别 是 , 它 会 生成 两 个 带有 一 个 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 注解 之 一 。 它们 将 自动 提供 正确 的 属性 Map 和 位置 参数 构造 函数 。 TupleConstructor 只 提供 构造 函数 , Canonical 应用 了 关于 equalshashCodetoString 的 一些 其他 最 佳 做法 。

相关问题