当前位置:  开发笔记 > 编程语言 > 正文

+操作符在groovy中的字符串连接中意外地表现

如何解决《+操作符在groovy中的字符串连接中意外地表现》经验,为你挑选了1个好方法。

我们习惯于重写toString方法,这样我们就可以通过调用来获取字段值

println"对象详细信息 - > $ object"

我们考虑为我们的构建编写测试用例作为一种良好实践并遵循TDD.

我的测试用例因一些数据缺失而失败.测试用例如下所示:

void "test method:toString"() {
        given:
        CSV csv = new CSV(accountId: '1', accountName: 'testName')

        when:
        String exp = "[accountId=" + csv.accountId + ", groupId)" + csv.groupId + ", accountName=" + csv.accountName +"]"
        String string = csv.toString()

        then:
        string == exp
    }

以下是我的课程:

public class CSV   {
     String accountId
     String groupId
     String accountName
     String chargeMode
     String invoiceId
     String date

    @Override
    public String toString() {
        return "ChargingCsvLine [accountId=" 
               + accountId + ", groupId)" + groupId + ",      accountName="+
                 accountName + " "]"
    }
}

测试用例突然失败.然后我仔细看了一下,尝试在换行符末尾附加'+',而不是在行开头.

测试用例正常工作.

任何人都可以告诉我,这是一个错误或groovy只是接受了上述两种情况,但在行尾附加'+'的情况是唯一正确的方法.

对我来说似乎使用'+'连接的正确方法是

"abc"+
"def"

并不是

"abc"
+"def"

但是为什么groovy在这种情况下默默地破坏并且没有抛出任何错误.至少应抛出操作员级异常.

谢谢!



1> cfrick..:

Groovy占用你的第一行(没有结尾+)并使用这个return语句并且不执行任何进一步的代码.

String add1() {
    return "1"
    + "2" // never gets executed
}
assert add1()=="1"

如果没有return它会给你一个运行时错误:

String add1() {
    "1" // one statement
    + "2" // another statement - this is the implicit return
}
assert add1()=="12"

这失败了:

Caught: groovy.lang.MissingMethodException: No signature of method: java.lang.String.positive() is applicable for argument types: () values: []
Possible solutions: notify(), tokenize(), size(), size()
groovy.lang.MissingMethodException: No signature of method: java.lang.String.positive() is applicable for argument types: () values: []
Possible solutions: notify(), tokenize(), size(), size()
        at tos.add1(tos.groovy:3)
        at tos$add1.callCurrent(Unknown Source)
        at tos.run(tos.groovy:6)

shell returned 1

这里的原因是,groovy看到两行,而字符串不会覆盖positive运算符.

如果使用静态编译,它也无法编译:

@groovy.transform.CompileStatic
String add1() {
    return "1"
    + "2"
}
assert add1()=="1"

产量:

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
test.groovy: 4: [Static type checking] - Cannot find matching method java.lang.String#positive(). Please check if the declared type is right and if the method exists.
 @ line 4, column 2.
        + "2"
    ^

1 error

小贴士:

groovy与java有区别

在groovy中toString时,不要在IDE中生成@ToString

+当有GStrings的时候,不要在groovy中一起敲打字符串.

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有