2016-08-10 23 views
0

私は現在、いくつかの正規表現にマッチして、正規表現にマッチする文字列の中で何らかの置換を行うことができるコードを作成中です。ソナーが文句を言う:StringBufferの代わりにStringBuilderを使用する

私はmatcherオブジェクトをjavaで使用しています。しかし、 インターネット全体から見ると、すべての例では、appendreplacementメソッドとappendtailメソッド(oracleDoc)を使っていくつかの置換を行うためにStringBufferを使用しています。

しかし、コードをプッシュすると、Sonarはstringbuilderの代わりにstringbufferを使用することについて不平を言います。

  • このケースでは、この警告はエラーですか?
  • 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()); 

情報を:APPENDためのStringBuilderを管理マッチャーは、それは警告ではなく、エラーのJDK 9 source codecode review

答えて

4

になります。ソナーは、StringBuilderが好ましいと警告してくれます。because it is fasterです。 APIでStringBufferを使用する必要がある場合は、それを使用して警告を消音します。

私はAppendableは、より汎用的なインタフェースである(Patternとの本当の根本的な問題との両方のバッファがStringBufferStringBuilderは、建物文字列の特定のインターフェイスを共有していないということだと思う、私は、彼らは文字列を構築するためのより具体的なインターフェイスを共有すべきだと思いますStringConstructorのようなもの)、これはあなたがゼロ努力(通常)で実装を切り替えることを可能にします。

+0

"StringBufferとStringBuilderは特定のインターフェイスを共有しません"。彼らは:彼らは両方とも 'Appendable'を実装しています。そうでなければ、あなたが何を意味するのか分かりません。その場合は、明確にすることができますか? –

+0

@OlivierGrégoireはい、申し訳ありませんが、あなたが正しいです、それははっきりしていません。 'Appendable'はより汎用的なインターフェースです。私は、StringConstructorなどのような、文字列を構築するためのより具体的なインターフェースを共有する必要があると思います。 – m0skit0

+0

まあ、技術的にも(OpenJDKでは)そうしています。両方とも 'AbstractStringBuilder'を拡張していますが、残念ながらpublicではありません。 –

関連する問題