2009-12-02 4 views
2

Я currentlly рефакторинга приложения, использующее много этого:StringBuffer Append («»)

StringBuffer buff1 = new StringBuffer(""); 

buff1.append("some value A"); 
buff1.append(""); 
buff1.append("some value B"); 

кодера, который сделал эти строки коды не кажется идиот, есть ли причины I не можете использовать append ("") для StringBuffer?

+0

Появляется ли текст вывода как «некоторое значение Asome value B», поэтому t теперь нечитабельно? – Mark

ответ

4

Очень вероятно, что код был сгенерирован каким-то инструментом рефакторинга, и кодер не беспокоился об удалении избыточных строк.

+0

на деле. – lemotdit

+1

Gotta люблю имена переменных, такие как 'buff1'. –

4

Нет, вам это не нужно append(""). Вам также не нужно инициализировать StringBuffer с помощью String. new StringBuffer(); будет работать нормально.

4

Nope.

И учитывая, что они жестко закодированных строк, было бы идентичным написать

buff1 = new StringBuffer("some value Asome value B"); 

Кстати, это немного более эффективно использовать StringBuilder, а не StringBuffer (и API идентичен).

+2

Не является ли StringBuilder безопасным? – lemotdit

+1

это не так, но как часто вы изменяете один экземпляр StringBuffer между разными потоками? –

+0

Да, но почти всегда вы используете его локально в одном потоке, поэтому вам не нужна безопасность потоков. – starblue

0

Единственная причина, по которой я могу думать о том, почему он сделал это, является читабельностью (хотя даже это кажется немного странным).

+0

Я считаю, что 'String buff1 =" некоторое значение A некоторое значение B ";' гораздо более читаемое, чем указано выше –

2

Если нет никаких дополнительных Присоединяет, сделанные в StringBuffer код должен быть переписан в

String buff1 = "some value some value B"; 

Это более кратким, более удобным для чтения и безопаснее, чем:

StringBuffer buff1 = new StringBuffer(""); 

buff1.append("some value A"); 
buff1.append("some value B"); 

Я говорю «безопаснее» потому что String неизменен и StringBuffer неизменен, поэтому нет никакого риска, что String случайно изменится после построения.


Помимо

Это распространенное заблуждение, что "конкатенации строк в Java плохо". Хотя это правда, что вы не должны писать код, как этот

String buff1 = "foo";  
buff1 += "some value A"; 
buff1 += "some value B"; 

Это вполне приемлемо, чтобы написать такой код:

String buff1 = "foo" + "some value A" + "some value B"; 

когда конкатенация выполняется в одном операторе код будет оптимизирован :

String buff1 = "foo some value A some value B"; 
+0

Не следует ли компилятору переписать эту конкатенацию литералов как единый литерал? Во время выполнения не было бы заметной разницы. – seh

+1

Да, для JLS Раздел 3.10.5, * String Literals *, такое постоянное выражение переписывается как одна * интернированная * строка. – seh

+0

@seh - хорошо заметили, я обновлю! –

0

Возможно, он намеревался поставить buff1.append(" ");. Просто я беру.

0

buff1.append ("") не имеет значения и его следует удалить.

Смежные вопросы