Java concatenate для построения строки или формата

Я пишу грязь (текстовая игра) на данный момент с помощью java. Одним из основных аспектов грязи является форматирование строк и отправка их обратно пользователю. Как это лучше всего сделать?

скажем, я хотел отправить следующую строку:

вы говорите кому-то "привет!- где "кто-то", "скажите" И " Здравствуйте!"все переменные. Что было бы лучше всего?

"You " + verb + " to " + user + " "" + text + """

или

String.format("You %1$s to %2$s "%3$s"", verb, user, text)

или какой-нибудь другой вариант?

Я не уверен, что будет проще использовать в конце (что важно, потому что это будет везде), но я думаю об этом на данный момент, потому что конкатенация с +становится немного запутанной с некоторыми из больших линий. Я чувствую, что использование StringBuilder в этом случае просто сделает его еще менее читаемым.

здесь предложение?

8 ответов


если строки построены с использованием одного выражения конкатенации; например

String s = "You " + verb + " to " + user + " \"" + text + "\"";

тогда это более или менее эквивалентно более занудный:

StringBuilder sb = new StringBuilder();
sb.append("You");
sb.append(verb);
sb.append(" to ");
sb.append(user);
sb.append(" \"");
sb.append(text );
sb.append('"');
String s = sb.toString();

(фактически, компилятор Java скомпилирует первый в последний ... почти.)

проблемы эффективности возникают, когда вы начинаете создавать промежуточные строки или строить строки с помощью += и так далее. В этот момент StringBuilder становится более эффективным, потому что вы уменьшаете количество промежуточные строки, которые создаются, а затем выбрасываются.

теперь, когда вы используете String.format(), он должен использовать StringBuilder под капотом. Однако,format также должен анализировать строку формата каждый раз, когда вы делаете вызов, и это накладные расходы, которых у вас нет, если вы делаете построение строки оптимально.


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

в другом ответе упоминается, что использование строки формата может упростить поддержку нескольких языков. Это верно, хотя есть пределы тому, что вы можете сделать в отношении таких вещей, как множественность, пол и так далее.


Concateneting с плюсом, compilet может преобразовывает код в performatic пути. Со строковым форматом я не знаю.

Я предпочитаю cocatenation с плюсом, я думаю, что это легче, чем undersand.


ключ к его простоте-никогда не смотреть на него. Вот что я имею в виду:

Joiner join = Joiner.on(" ");

public void constructMessage(StringBuilder sb, Iterable<String> words) {
  join.appendTo(sb, words);
}

Я использую класс столяра Guava, чтобы сделать читаемость не проблемой. Что может быть яснее, чем "присоединиться"? Все неприятные моменты, касающиеся конкатенации, хорошо спрятаны. Используя Iterable, я могу использовать этот метод со всеми видами структур данных, списки являются наиболее очевидными.

вот пример вызова с использованием Guava ImmutableList (который более эффективен, чем обычный список, так как любые методы, которые изменяют список, просто выбрасывают исключения и правильно представляют тот факт, что constructMessage () не может изменить список слов, просто потребляйте его):

StringBuilder outputMessage = new StringBuilder();
constructMessage(outputMessage, 
         new ImmutableList.Builder<String>()
            .add("You", verb, "to", user, "\"", text, "\"")
            .build());

Я буду честен и предлагаю вам взять первый, если вы хотите меньше печатать, или последний, если вы ищете более C-стиль способ сделать это.

кого-нибудь еще есть идеи?


предполагая, что вы собираетесь повторно использовать базовые строки, часто храните свои шаблоны как

String mystring = " вы $1 к $2 \"$3\""

затем просто получите копию и замените $X тем, что вы хотите.

Это будет очень хорошо работать и для файла ресурсов.


Я думаю, что конкатенация с + более читаем, чем с помощью String.format.

String.format хорошо, когда вам нужно отформатировать число и даты.


Я думаю, что строку.формат выглядит чище. Однако вы можете использовать StringBuilder и использовать функцию append для создания strin, который вы хотите


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