Groovy:构造函数哈希冲突

时间:2018-08-09 19:22:49

标签: groovy hash constructor collision

我有以下常规代码:

def    script
String credentials_id
String repository_path
String relative_directory
String repository_url

CredentialsWrapper(script, credentials_id, repository_name, repository_group, relative_directory=null) {
    this(script, credentials_id, 'git@gitlab.foo.com:' + repository_group +'/' + repository_name + '.git', relative_directory);             
}

CredentialsWrapper(script, credentials_id, repository_url, relative_directory=null) {

    this.script         = script;
    this.credentials_id = credentials_id;
    this.repository_url = repository_url;

    if (null == relative_directory) {

        int lastSeparatorIndex  = repository_url.lastIndexOf("/");
        int indexOfExt          = repository_url.indexOf(".git"); 
        this.relative_directory = repository_url.substring(lastSeparatorIndex+1, indexOfExt);
    }
}

詹金斯给了我以下内容:

由于在第30行第7列的构造函数中发生哈希冲突,因此无法编译com.foo.CredentialsWrapper类。

我不明白为什么,构造函数不同,它们没有相同数量的参数。

此外,“脚本”是“工作流脚本”的一个实例,但我不知道应导入什么以访问该类,这将允许我显式声明脚本而不是使用“ def”

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

当您使用四个参数调用构造函数时,您要调用第一个还是第二个?

如果您使用默认值编写构造函数/方法,groovy实际上会生成两个或多个版本。 所以

Test(String x, String y ="test")

将导致

Test(String x, String y) {...}

Test(String x) {new Test(x, "test")}

因此您的代码想编译为4个构造函数,但其​​中包含带有签名的构造函数 CredentialsWrapper(def, def, def, def) 两次。 如果我正确理解您的代码,则可以省略=null中的一个或两个。结果将是相同的,但是您将仅获得两个或三个签名。然后,您可以通过调用具有正确参数计数的两个版本来进行选择。