Скажем, я имею два char
переменные, и позже я хочу связать их в строку. Это - то, как я сделал бы это:
char c1, c2;
// ...
String s = "" + c1 + c2;
Я видел людей, которые говорят что "" +
"прием" "ужасен", и т.д., и что необходимо использовать String.valueOf
или Character.toString
вместо этого. Я предпочитаю эту конструкцию потому что:
c1
и c2
находятся визуально на том же уровне String.valueOf(c1) + c2
предполагает, что что-то является особенным о c1
Есть ли действительно хороший аргумент почему String.valueOf
или Character.toString
предпочтительно для "" +
?
Мелочи: в java.lang.AssertionError
, следующая строка появляется 7 раз, каждый с другим типом:
this("" + detailMessage);
Ваши аргументы хороши; это одна из наиболее выразительных областей языка Java, и идиома "" +
кажется хорошо укоренившейся, как вы обнаружили.
См. Конкатенация строк в JLS. Выражение, подобное
"" + c1 + c2
, эквивалентно
new StringBuffer().append(new Character(c1).toString())
.append(new Character(c2).toString()).toString()
, за исключением того, что все промежуточные объекты не нужны (поэтому эффективность не является мотивом). В спецификации сказано, что реализация может использовать StringBuffer
или нет. Поскольку эта функция встроена в язык, я не вижу причин использовать более подробную форму, особенно в уже многословном языке.
На мой взгляд, "" + x
очень читабельный, короткий и точный по сути. Я бы предпочел более длинные конструкции вроде String.valueOf
. Поведение хорошо определено и настолько широко используется, что мне вообще трудно назвать это взломом.
Единственное, о чем я бы немного беспокоился, так это о производительности - и я очень уверен, что обычно это не имеет значения (хотя я не измерял и не смотрел двоичный файл). Также существует большая вероятность того, что этот вид concat будет оптимизирован, поскольку его должно быть легко обнаружить (хотя это всего лишь предположение).
Я думаю, что в "" + var
оператор +
фактически перегружен для выполнения преобразования:
Язык Java предоставляет специальную поддержку для оператора конкатенации строк ( + ), а также для преобразования других объектов в строки. Конкатенация строк реализуется через класс StringBuilder (или StringBuffer) и его метод append. Преобразование строк осуществляется с помощью метода toString, который определяется классом Object и наследуется всеми классами Java. Дополнительная информация о конкатенации и преобразовании строк
Итак, с технической точки зрения нет никакой разницы и никаких проблем.
С точки зрения удобства чтения - это вопрос личных предпочтений или согласованного стиля кодирования в команде.
А как насчет
new String(new char[] {a, b})
, и если вы будете делать это много, вы можете создать класс «Строки» с помощью:
public static String valueOf(char... chars) {
return new String(chars);
}
Тогда ваша строка будет читать
String s = Strings.valueOf(a, b);
Красиво и коротко.
Отредактировано
Лучшее название может быть:
String s = Chars.asString(a, b);
Если вашему приложению не требуется максимальная производительность, напишите код, который будет быстрее писать и легче читать. "" + - это более медленный синтаксис, но он определенно кажется более легким для чтения каждый раз, когда я его использую.
Проблема с этой конструкцией в том, что она обычно не выражает намерения.
Он представляет собой конкатенацию строки с другим значением, но конкатенация обычно не является целью этой строки.
В конкретном случае, который вы продемонстрировали, конкатенация на самом деле является целью, поэтому этот код действительно выражает намерение.
При более распространенном использовании этого подхода ( String s = "" + intValue;
) конкатентация является просто допустимым побочным эффектом, в то время как преобразование intValue
является актуальная цель. А простой String.valueOf (intValue)
выражает это намерение намного яснее.
Я предпочитаю использовать String.valueOf
для одиночных преобразований - но в вашем случае вам действительно нужна конкатенация.
Тем не менее, я бы посоветовал, чтобы эта версия устранила всю потенциальную двусмысленность:
String s = c1 + "" + c2;
Таким образом, нет никакой возможности, даже маловероятной, чтобы кто-то задумывался о том, будут ли c1 и c2 добавлены вместе перед конкатенацией.