Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 声纳抱怨:使用StringBuilder而不是StringBuffer_Java_Append_Sonarqube_Stringbuilder_Stringbuffer - Fatal编程技术网

Java 声纳抱怨:使用StringBuilder而不是StringBuffer

Java 声纳抱怨:使用StringBuilder而不是StringBuffer,java,append,sonarqube,stringbuilder,stringbuffer,Java,Append,Sonarqube,Stringbuilder,Stringbuffer,我目前正在做一段代码,它必须能够匹配一些regexp,并在匹配regexp的字符串中进行一些替换 为了做到这一点,我使用java中的对象。但是 正如你们在互联网上所看到的,所有的例子都使用StringBuffer来使用appendreplacement和appendtail方法进行替换 但当我推我的代码时,Sonar抱怨使用stringbuffer而不是stringbuilder 声纳发出的警告在这种情况下是错误的吗? 是否有使用stringbuilder执行相同操作的库? 显然,一些开发人员对

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

为了做到这一点,我使用java中的对象。但是 正如你们在互联网上所看到的,所有的例子都使用StringBuffer来使用appendreplacement和appendtail方法进行替换

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

声纳发出的警告在这种情况下是错误的吗? 是否有使用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());

信息:管理stringbuilder进行追加的匹配器将在jdk 9中,这是一个警告,而不是错误。Sonar的作用是警告您StringBuilder更可取。如果API强制您使用StringBuffer,那么我将使用它并使警告静音


我认为模式和两个缓冲区的真正根本问题是StringBuffer和StringBuilder没有共享用于构建字符串的特定接口Appendable是一个更通用的接口,我认为它们应该共享用于构建字符串的更特定接口,比如StringConstructor,这将允许您以零努力的方式切换实现。

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


我认为模式和两个缓冲区的真正根本问题是StringBuffer和StringBuilder没有共享用于构建字符串的特定接口Appendable是一个更通用的接口,我认为它们应该共享用于构建字符串的更特定接口,比如StringConstructor,这将允许您无需任何努力即可切换实现。

StringBuffer和StringBuilder不共享特定的接口。它们都实现了:它们都实现了appendeable。或者我只是不明白你的意思,在这种情况下,你能澄清一下吗?@OlivierGrégoire是的,对不起,你是对的,这还不清楚。Appendable是一个更通用的接口。我认为它们应该共享一个更具体的接口来构造字符串,比如StringConstructor之类的东西。从技术上讲,它们在OpenJDK中也是如此。两者都扩展了AbstractStringBuilder,不幸的是,它不是公共的。@OlivierGrégoire这不是官方JavaDoc所说的,这才是最重要的。事实上,从技术上讲,不幸的是,StringBuffer和StringBuilder并不共享特定的接口。它们都实现了:它们都实现了appendeable。或者我只是不明白你的意思,在这种情况下,你能澄清一下吗?@OlivierGrégoire是的,对不起,你是对的,这还不清楚。Appendable是一个更通用的接口。我认为它们应该共享一个更具体的接口来构造字符串,比如StringConstructor之类的东西。从技术上讲,它们在OpenJDK中也是如此。两者都扩展了AbstractStringBuilder,不幸的是,它不是公共的。@OlivierGrégoire这不是官方JavaDoc所说的,这才是最重要的。事实上,从技术上来说,这是不幸的。