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, который вы хотите