2009-04-21 3 views

ответ

49
String test = String.format("test goes here %s more text", "Testing"); 

ближе всего, что вы могли бы написать в Java

+4

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

0

Что вы хотите назвать String interpolation. Это невозможно в Java, хотя JRuby, Groovy и, возможно, другие языки JVM это делают.


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

1

Это может быть сделано с помощью некоторых шаблонов. Но будьте осторожны, Строки неизменны в Java. Поэтому в каждом случае на каком-то низком уровне конкатенация будет выполнена.

1

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

То, как вы написали это, будет неявно построить StringBuilder и использовать его для объединения строк. Другим методом является String.format(String, Object...) , что аналогично sprintf от C. Но даже с format() вы не можете избежать конкатенации.

Да, я знаю, что якорная связь нарушена.

0

Вы можете использовать бесплатную библиотеку this. Он дает вам sprintf как функциональность. Или используйте статический метод String.format, если вы используете Java 5 или новее.

25

Более изящный способ может быть:

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); 
+1

+1 для MessageFormat - Я искал это! –

+0

Проверьте Rythm (https://github.com/greenlaw110/rythm/downloads), что позволяет вам делать что-то вроде «String result = Rythm.render (« текст идет здесь @ значение больше текста »,« Тестирование ») , Не только яснее, чем 'String.format', но и быстро. Это в 2 раза быстрее, чем String.format –

0

Почему вы думаете, конкатенация не элегантный?

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

Производительность не будет проблемой, о которой думают большинство людей.

Прочитайте это от CodingHorror

+0

Согласен, я придерживаюсь конкатенации по методу .format. Я надеялся на оценку строки, похожую на PHP. –

0

Я хотел бы использовать StringBuffer .. это обычная практика, когда вы имеете дело со строками. Это может показаться немного, когда вы видите его в первый раз, но вы получите быстро привыкнете к нему ..

String test = new StringBuffer("text goes here ").append(value1).append(" more text").toString(); 

Строки неизменны, таким образом, создается новый экземпляр после каждой конкатенации. Это может вызвать проблемы с производительностью при использовании в цикле.

StringBuffer изменчиво версия строки - это означает, что вы можете создать, изменить его, как вы хотите, и у вас есть еще только один экземпляр. По желанию вы можете получить строковое представление StringBuffer, вызвав его метод toString().

+1

В большинстве случаев вы можете использовать StringBuilder. Он имеет лучшую производительность. Это не потокобезопасно, но большую часть времени это нормально. –

+0

Нет необходимости использовать StringBuilder/Buffer, за исключением добавления в цикл. Компилятор будет генерировать тот же байт-код для нового StringBuilder(). Append («hello»). Append (value1) .toString() как для «hello» + value1; Это можно проверить, декомпилировав файл класса с помощью команды javap. – dnault

0

Проблема не в том, что это изящный способ или нет. Идея использования системы шаблонов может заключаться в том, что вы помещаете свой шаблон в обычный текстовый файл и не должны изменять код Java, если вы меняете свое сообщение (или думаете об i18ln).

+1

Это комментарий к ответу не ответ –

3

Rythm шаблонный движок Java теперь выпустил с новой функцией под названием String interpolation mode, который позволяет сделать что-то вроде:

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); 

Ссылки:

Смежные вопросы