我目前正在编写一段代码,它必须能够匹配某些正则表达式,并在与正则表达式匹配的字符串中进行一些替换。
为了做到这一点,我使用 matcher java中的对象。但 正如您在互联网上看到的那样,所有示例都使用 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 code 中和 code review
最佳答案
这是警告,而不是错误。 Sonar 会警告您 StringBuilder
更可取 because it is faster 。如果 API 强制您使用 StringBuffer,那么我会使用它并消除警告。
我认为 Pattern
和两个缓冲区的真正根本问题是 StringBuffer
和 StringBuilder
不共享用于构建字符串的特定接口(interface)( Appendable
是一个更通用的接口(interface),我认为它们应该共享一个更具体的接口(interface)来构造字符串,例如 StringConstructor
),这将允许您零努力地切换实现(通常)。
关于java - Sonar 提示: use StringBuilder instead of StringBuffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38877546/