Есть ли более элегантный способ сделать это на Java?
String value1 = "Testing";
String test = "text goes here " + value1 + " more text";
Можно ли поместить переменную непосредственно в строку и оценить ее значение?
Есть ли более элегантный способ сделать это на Java?
String value1 = "Testing";
String test = "text goes here " + value1 + " more text";
Можно ли поместить переменную непосредственно в строку и оценить ее значение?
String test = String.format("test goes here %s more text", "Testing");
- самая близкая вещь, которую вы могли бы написать в Java
Более элегантный способ может быть:
String value = "Testing";
String template = "text goes here %s more text";
String result = String.format(template, value);
Или, альтернативно, используя MessageFormat:
String template = "text goes here {0} more text";
String result = MessageFormat.format(template, value);
Обратите внимание, что если вы делаете это для ведения журнала, вы можете избежать затрат на выполнение этого, когда строка журнала будет ниже порога. Например, SLFJ:
Следующие две строки приведут к тому же самому результату. Тем не менее, вторая форма будет превосходить первую форму не менее чем в 30 раз в случае отключенной записи журнала.
logger.debug("The new entry is "+entry+".");
logger.debug("The new entry is {}.", entry);
Rythm java template engine теперь выпущен с новой функцией Режим интерполяции строк, который позволяет вам делать что-то вроде
String result = Rythm.render("Hello @who!", "world");
В приведенном выше примере вы можете передать аргумент шаблону по позиции. Rythm также позволяет передавать аргументы по имени:
Map<String, Object> args = new HashMap<String, Object>();
args.put("title", "Mr.");
args.put("name", "John");
String result = Rythm.render("Hello @title @name", args);
Ссылки:
Это может быть сделано с помощью некоторых шаблонов. Но будьте осторожны, Строки неизменны в Java. Поэтому в каждом случае на некотором низком уровне будет выполняться конкатенация.
Вам всегда нужно использовать некоторую форму конкатенации (если значение1 не является константой, как показано здесь).
То, как вы его написали, неявно построит StringBuilder
и использует его для объединения строк. Другим методом является String.format(String, Object...)
1 что аналогично sprintf
из C. Но даже с format()
, вы не можете избежать конкатенации.
1 Да, я знаю, что ссылка на якорь сломана.
То, что вы хотите, называется Строковая интерполяция. Это невозможно в Java, хотя JRuby, Groovy и, возможно, другие языки JVM делают это.
Изменить: как для элегантности вы можете использовать StringBuffer или проверить другое плакатное решение. Но на низком уровне это всегда будет конкатенация, как говорили другие плакаты.
Вы можете использовать эту бесплатную библиотеку. Это дает вам функциональность sprintf. Или используйте String.format статический метод, если вы используете Java 5 или новее.
Почему вы считаете, что конкатенация строк не изящна?
Если все, что вы делаете, это простая конкатенация, я бы утвердил, что читаемость кода важнее, и я оставил бы ее, как у вас. Это более читаемо, чем использование StringBuilder.
Производительность не будет проблемой, о которой думают многие.
Прочтите это из CodingHorror
Я бы использовал StringBuffer. Это обычная практика, когда вы имеете дело со строками. Это может показаться немного, когда вы видите его в первый раз, но вы быстро привыкнете к нему.
String test = new StringBuffer("text goes here ").append(value1).append(" more text").toString();
Строки неизменяемы, поэтому после каждого конкатенации создается новый экземпляр. Это может вызвать проблемы с производительностью при использовании в циклах.
StringBuffer - изменяемая версия String. Это значит, что вы можете ее создать, изменить, как хотите, и у вас есть только один экземпляр. По желанию вы можете получить строковое представление StringBuffer, вызывая его toString().
Проблема не в том, что это элегантный способ или нет. Идея использования системы шаблонов может заключаться в том, что вы помещаете свой шаблон в обычный текстовый файл и не должны изменять код Java, если вы меняете свое сообщение (или думаете об i18ln).