Java 声纳抱怨:使用StringBuilder而不是StringBuffer
我目前正在做一段代码,它必须能够匹配一些regexp,并在匹配regexp的字符串中进行一些替换 为了做到这一点,我使用java中的对象。但是 正如你们在互联网上所看到的,所有的例子都使用StringBuffer来使用appendreplacement和appendtail方法进行替换 但当我推我的代码时,Sonar抱怨使用stringbuffer而不是stringbuilder 声纳发出的警告在这种情况下是错误的吗? 是否有使用stringbuilder执行相同操作的库? 显然,一些开发人员对此表示不满 我找到了一种不使用StringBuffer和使用StringBuilder的方法,但我确信这不如使用StringBuffer有效,可能是一种不好的做法。您可以在junit测试中复制粘贴此示例代码,如下所示:Java 声纳抱怨:使用StringBuilder而不是StringBuffer,java,append,sonarqube,stringbuilder,stringbuffer,Java,Append,Sonarqube,Stringbuilder,Stringbuffer,我目前正在做一段代码,它必须能够匹配一些regexp,并在匹配regexp的字符串中进行一些替换 为了做到这一点,我使用java中的对象。但是 正如你们在互联网上所看到的,所有的例子都使用StringBuffer来使用appendreplacement和appendtail方法进行替换 但当我推我的代码时,Sonar抱怨使用stringbuffer而不是stringbuilder 声纳发出的警告在这种情况下是错误的吗? 是否有使用stringbuilder执行相同操作的库? 显然,一些开发人员对
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所说的,这才是最重要的。事实上,从技术上来说,这是不幸的。