Конкатенация это плохой способ?

310
30 января 2017, 16:53

В книге вычитал, что приведение int в String с использованием конкатенации, например, где а это int

String s = a + "";

это плохой способ. А вот

String s = Integer.toString(a);

Или

String s = String.valueOf(a);

Это хорошие способы. Почему?

Answer 1

Нет, конкатенация - это не плохо. Она выглядит более наглядно и в большинстве случаев, javac умеет ее оптимизировать с использованием java.lang.StringBuilder. Так же, срабатывает интернирование, что позволяет не создавать множество объектов. Например,

 String value = "hello world" + 1;
 System.out.println(value == "hello world1");

выведет

true

А методы Integer.toString и String.valueOf идентичны, т.к. последний делегирует вызов второму. Но у них есть особенность - при каждом вызове создается новая строка.

Answer 2

Ну, может быть, если там не просто число, а выражение, не сразу очевидно, что получится в результате. Например такой код:

System.out.println(6 + 4 + "");
System.out.println("" + 4 + 6);

В первой строке выведет 10, а во второй - 46.

Answer 3

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

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

Два варианта кода:

String s = a + "";
String s = Integer.toString(a);

Второй является совершенно обычным и стандартным паттерном, который не вызовет никаких затруднений, а на первом он споткнется и будет пару минут тупить, стараясь понять, что там происходит и почему решили сделать именно так.

Answer 4

При использовании конкатенации выполняется несколько ненужных действий:

  • неявно вызывается Integer.toString(a);

  • выделяется StringBuffer для конкатенации, куда копируется пустая строка "" и переведённое в строку число

  • преобразовывается StringBuffer в строку

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

READ ALSO
Панель открытых окон

Панель открытых окон

Скажите пожалуйста, как на java server face реализовать панель открытых окон? Строим учетную программу, нужно открыть несколько окон одновременно...

333
Аутентификация в Spring Security

Аутентификация в Spring Security

Разбираюсь с Spring Security(и параллельно пишу веб приложение)Всё работает, но есть пара вопросов

502
Правильно ли я делаю (ViewPager и RecyclerView)

Правильно ли я делаю (ViewPager и RecyclerView)

Просьба помочь с алгоритмом действийЕсть DrawerLayout по нажатию на его пункт отрывается фрагмент-1 в котором присутствует RecyclerView который выводит...

384
Прерывание цикла for с помощью break это плоxo?

Прерывание цикла for с помощью break это плоxo?

И снова я со своей книгой "Для про"Почему в цикле for не рекомендуется прерывание с помощью break? Как же тогда это сделать?

270