Конкатенирует с пустой строкой, чтобы сделать преобразование строк действительно это плохо?

Скажем, я имею два char переменные, и позже я хочу связать их в строку. Это - то, как я сделал бы это:

char c1, c2;
// ...

String s = "" + c1 + c2;

Я видел людей, которые говорят что "" + "прием" "ужасен", и т.д., и что необходимо использовать String.valueOf или Character.toString вместо этого. Я предпочитаю эту конструкцию потому что:

  • Я предпочитаю использовать функцию языка вместо вызова API, если это возможно,
    • В целом язык не обычно более стабилен, чем API?
    • Если функция языка только скрывает вызов API, то еще более сильная причина предпочесть его!
      • Более абстрактный! Сокрытие хорошо!
  • Мне нравится этот c1 и c2 находятся визуально на том же уровне
    • String.valueOf(c1) + c2 предполагает, что что-то является особенным о c1
  • Это короче.

Есть ли действительно хороший аргумент почему String.valueOf или Character.toString предпочтительно для "" +?


Мелочи: в java.lang.AssertionError, следующая строка появляется 7 раз, каждый с другим типом:

    this("" + detailMessage);

40
задан polygenelubricants 24 March 2010 в 09:32
поделиться

7 ответов

Ваши аргументы хороши; это одна из наиболее выразительных областей языка Java, и идиома "" + кажется хорошо укоренившейся, как вы обнаружили.

См. Конкатенация строк в JLS. Выражение, подобное

"" + c1 + c2

, эквивалентно

new StringBuffer().append(new Character(c1).toString())
                  .append(new Character(c2).toString()).toString()

, за исключением того, что все промежуточные объекты не нужны (поэтому эффективность не является мотивом). В спецификации сказано, что реализация может использовать StringBuffer или нет. Поскольку эта функция встроена в язык, я не вижу причин использовать более подробную форму, особенно в уже многословном языке.

26
ответ дан 27 November 2019 в 01:46
поделиться

На мой взгляд, "" + x очень читабельный, короткий и точный по сути. Я бы предпочел более длинные конструкции вроде String.valueOf . Поведение хорошо определено и настолько широко используется, что мне вообще трудно назвать это взломом.

Единственное, о чем я бы немного беспокоился, так это о производительности - и я очень уверен, что обычно это не имеет значения (хотя я не измерял и не смотрел двоичный файл). Также существует большая вероятность того, что этот вид concat будет оптимизирован, поскольку его должно быть легко обнаружить (хотя это всего лишь предположение).

2
ответ дан 27 November 2019 в 01:46
поделиться

Я думаю, что в "" + var оператор + фактически перегружен для выполнения преобразования:

Язык Java предоставляет специальную поддержку для оператора конкатенации строк ( + ), а также для преобразования других объектов в строки. Конкатенация строк реализуется через класс StringBuilder (или StringBuffer) и его метод append. Преобразование строк осуществляется с помощью метода toString, который определяется классом Object и наследуется всеми классами Java. Дополнительная информация о конкатенации и преобразовании строк

Итак, с технической точки зрения нет никакой разницы и никаких проблем.

С точки зрения удобства чтения - это вопрос личных предпочтений или согласованного стиля кодирования в команде.

2
ответ дан 27 November 2019 в 01:46
поделиться

А как насчет

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);
2
ответ дан 27 November 2019 в 01:46
поделиться

Если вашему приложению не требуется максимальная производительность, напишите код, который будет быстрее писать и легче читать. "" + - это более медленный синтаксис, но он определенно кажется более легким для чтения каждый раз, когда я его использую.

1
ответ дан 27 November 2019 в 01:46
поделиться

Проблема с этой конструкцией в том, что она обычно не выражает намерения.

Он представляет собой конкатенацию строки с другим значением, но конкатенация обычно не является целью этой строки.

В конкретном случае, который вы продемонстрировали, конкатенация на самом деле является целью, поэтому этот код действительно выражает намерение.

При более распространенном использовании этого подхода ( String s = "" + intValue; ) конкатентация является просто допустимым побочным эффектом, в то время как преобразование intValue является актуальная цель. А простой String.valueOf (intValue) выражает это намерение намного яснее.

19
ответ дан 27 November 2019 в 01:46
поделиться

Я предпочитаю использовать String.valueOf для одиночных преобразований - но в вашем случае вам действительно нужна конкатенация.

Тем не менее, я бы посоветовал, чтобы эта версия устранила всю потенциальную двусмысленность:

String s = c1 + "" + c2;

Таким образом, нет никакой возможности, даже маловероятной, чтобы кто-то задумывался о том, будут ли c1 и c2 добавлены вместе перед конкатенацией.

5
ответ дан 27 November 2019 в 01:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: