Sonar抱怨:使用StringBuilder而不是StringBuffer

use*_*082 1 java stringbuilder append stringbuffer sonarqube

我目前正在做一段代码,必须能够匹配一些正则表达式,并在匹配正则表达式的字符串中进行一些替换.

为了做到这一点,我在java中使用matcher对象.但正如您可以在互联网上看到的那样,所有示例都使用StringBuffer来使用appendreplacement和appendtail方法(oracleDoc)进行替换.

但是当我推送我的代码时,Sonar抱怨使用stringbuffer而不是stringbuilder.

  • 在这种情况下,Sonar的这个警告是错误的吗?
  • 是否有任何库使用stringbuilder执行相同的操作?

显然,一些开发人员抱怨这里.

我找到了一种不使用StringBuffer并使用StringBuilder的方法,但我确信这不如使用StringBuffer那样有效(并且可能是一种不好的做法).您可以在junit测试中复制粘贴,此示例代码如下:

    String entry = "Actual 4.11-6 and 13-5";
    String expectedReturn = "Actual 4*11^(-6) and 13^(-5)";

    String number = "(^|\\s)-?\\d+((\\.||,)\\d+){0,1}(.\\d+){0,1}-\\d+";
    Pattern pattern = Pattern.compile(number);
    Matcher matcher = pattern.matcher(entry);

    //USING STRING BUFFER
    StringBuffer stringBuffer = new StringBuffer();
    String substring;
    while(matcher.find()){
        substring = matcher.group(0);
        matcher.appendReplacement(stringBuffer,substring.replace(".","*").replace("-","^(-")+")");
    }
    matcher.appendTail(stringBuffer);

    //USING STRING BUILDER
    matcher = pattern.matcher(entry);
    int lastIndex = 0;
    StringBuilder stringBuilder = new StringBuilder();
    while(matcher.find()){
        stringBuilder.append(entry.substring(lastIndex,matcher.start()));
        substring = matcher.group(0);
        stringBuilder.append(substring.replace(".","*").replace("-","^(-")+")");
        lastIndex = matcher.end();
    }
    stringBuilder.append(entry.substring(lastIndex,entry.length()));

    Assert.assertEquals(expectedReturn,stringBuffer.toString());
    Assert.assertEquals(expectedReturn,stringBuilder.toString());
Run Code Online (Sandbox Code Playgroud)

信息:管理stringbuilder for append的匹配器将在jdk 9 源代码代码审查中

m0s*_*it0 5

这是一个警告,而不是错误.Sonar的工作是警告你,因为它更快,StringBuilder所以更好.如果API强制您使用,那么我会使用它并使警告静音.StringBuffer

我认为Pattern和两个缓冲区的真正潜在问题是,StringBuffer并且StringBuilder不共享用于构建字符串的特定接口(Appendable是一个更通用的接口,我认为它们应该共享一个更具体的接口来构造字符串,类似的东西StringConstructor),这将允许你以零努力(通常)切换实现.