【问题标题】:Sonar complains : use StringBuilder instead of StringBuffer声纳抱怨:使用 StringBuilder 而不是 StringBuffer
【发布时间】:2016-12-17 01:58:12
【问题描述】:

我目前正在编写一段代码,它必须能够匹配一些正则表达式并在匹配正则表达式的字符串内进行一些替换。

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

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

  • 在这种情况下,Sonar 发出的这个警告是错误的吗?
  • 有没有使用 stringbuilder 做同样事情的库?

显然有些开发者抱怨here

我找到了一种不使用 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());

信息:为追加管理字符串构建器的匹配器将在 jdk 9 source codecode review

【问题讨论】:

    标签: java append sonarqube stringbuilder stringbuffer


    【解决方案1】:

    这是一个警告,而不是错误。 Sonar 会警告您 StringBuilder 更可取 because it is faster。如果 API 强制您使用 StringBuffer,那么我会使用它并使警告静音。

    我认为Pattern 和两个缓冲区的真正潜在问题是StringBufferStringBuilder 不共享用于构建字符串的特定接口(@98​​7654327@ 是一个更通用的接口,我认为它们应该共享一个用于构造字符串的更具体的接口,例如StringConstructor),这将允许您以零努力(通常)切换实现。

    【讨论】:

    • “StringBuffer 和 StringBuilder 不共享特定接口”。他们做到了:他们都实现了Appendable。否则我就是不明白你的意思,在这种情况下,你能澄清一下吗?
    • @OlivierGrégoire 是的,对不起,你是对的,这不清楚。 Appendable 是一个更通用的接口。我认为他们应该共享一个更具体的接口来构造字符串,比如StringConstructor 左右。
    • 好吧,从技术上讲,它们也是如此(在 OpenJDK 中)。两者都扩展了AbstractStringBuilder,不幸的是,它不公开。
    • @OlivierGrégoire 这不是官方 JavaDoc 所说的,这才是最重要的。
    • 确实,因此是“技术上”和“不幸”。
    猜你喜欢
    • 1970-01-01
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 2012-07-01
    • 2017-01-13
    • 2022-01-12
    • 2015-03-23
    相关资源
    最近更新 更多