2015-12-15 38 views
3

字符串連接我有一些代碼看起來像這樣(我換成普通的人我的業務變量):假陽性SonarQube違反了環路

Map<String, String> map = new HashMap<String, String>(); 
for (int i = 1; i < 10; i++) { 
    String suffix1 = retrieveValue1(i); 
    String suffix2 = retrieveValue2(i); 
    String tag = "prefix"; 
    if (suffix1 != null) { 
     tag += suffix1; 
    } 
    else { 
     tag += suffix2; 
    } 
    map.put(tag.toUpperCase(), "on"); 
} 

我有什麼錯誤,我收到以下SonarQube違規:

性能 - 法會連接使用+在一個循環

在我看來這是個假陽性(因爲沒有R串eal循環在這裏的字符串)但我想先仔細檢查。

我找不到任何與我的朋友Google相似的情況。

這是假陽性,還是在我的循環中有真正的性能損失?

+1

無論何時您的代碼執行了'tag + = suffix1',它都會創建多個String實例,並且在循環中也會這樣,因此違規。 – rd22

回答

1

是的,SonarQube可能會對循環內使用+=感到困惑。

String tag = "prefix";在循環內部創建所以有for循環中沒有字符串連接,在技術上,該警告是假陽性。

請注意,您仍然可以使用StringBuilder附加標籤的兩個部分,但您必須測量是否有必要。

+0

我真的很驚訝SonarQube不會過濾在循環內部創建的變量,然後由此規則的其他內容消耗。 我在循環外部創建了一個StringBuilder,在循環中實例化和追加,並推送builder.toString()。代碼有點冗長,但SonarQube停止了哭泣...... – jdebon

+0

@jdebon儘管有警告:不要成爲工具的奴隸。假陽性是現實,您可以在SonarQube中聲明違規爲假陽性。這可能比重新編寫代碼更好。 – Tunaki

+1

是的,我知道這=)但在我的情況下,它仍然是一個輕微的表現改善,所以我不介意。如果連接發生在同一行上,我會標記爲FP。謝謝=) – jdebon

-1

聲明循環外部的字符串變量。我認爲這可能會解決你的問題。

+0

這是行不通的。 – jdebon