加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Groovy命名和默认参数

发布时间:2020-12-14 16:24:43 所属栏目:大数据 来源:网络整理
导读: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") { _ini
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.Canonicalgroovy.transform.TupleConstructor注释之一.它们将自动提供正确的属性映射和位置参数构造函数. TupleConstructor仅提供构造函数,Canonical应用了与equals,hashCode和toString相关的一些其他最佳实践.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读