Есть ли способ построить строку Java с использованием функции форматирования в стиле SLF4J? - PullRequest
14 голосов
/ 25 июня 2010

Я слышал, что использование StringBuilder быстрее, чем использование конкатенации строк, но я устал все время бороться с объектами StringBuilder.Недавно я познакомился с библиотекой журналов SLF4J, и мне нравится простота ее форматирования «просто поступай правильно» по сравнению с String.format.Есть ли библиотека, которая позволила бы мне написать что-то вроде:

int myInteger = 42;
MyObject myObject = new MyObject();  // Overrides toString()
String result = CoolFormatingLibrary.format("Simple way to format {} and {}",
    myInteger, myObject);

Кроме того, есть ли какая-либо причина (включая производительность, но исключая детальный контроль даты и значительное форматирование цифр), почему я мог бы хотетьиспользовать String.format над такой библиотекой, если она существует?

Ответы [ 3 ]

19 голосов
/ 05 декабря 2016

Хотя приемлемый ответ хорош, если (как и я) кто-то интересуется именно семантикой в ​​стиле Slf4J, то правильным решением будет использование MessageFormatter

в Slf4J

Вот пример использования фрагмента:

public static String format(String format, Object... params) {
    return MessageFormatter.arrayFormat(format, params).getMessage();
}

(Обратите внимание, что в этом примере отбрасывается последний аргумент типа Throwable)

8 голосов
/ 25 июня 2010

Для конкатенации строк один раз старый надежный "str" + param + "other str" идеально подходит (на самом деле он конвертируется компилятором в StringBuilder).

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

String str = "";
for (int i = 0; i < 1000000; i++) {
    str += i + " "; // ignoring the last-iteration problem
}

Это будет работать намного медленнее, чем эквивалентная версия StringBuilder:

StringBuilder sb = new StringBuilder(); // for extra speed, define the size
for (int i = 0; i < 1000000; i++) {
    sb.append(i).append(" ");
}
String str = sb.toString();

Но эти два функционально эквивалентны:

String str = var1 + " " + var2;
String str2 = new StringBuilder().append(var1).append(" ").append(var2).toString();

Сказав все это, мой фактический ответ:

Выезд java.text.MessageFormat.Пример кода из Javadocs:

int fileCount = 1273;
String diskName = "MyDisk";
Object[] testArgs = {new Long(fileCount), diskName};

MessageFormat form = new MessageFormat("The disk \"{1}\" contains {0} file(s).");

System.out.println(form.format(testArgs));

Выход:

The disk "MyDisk" contains 1,273 file(s).

Есть также статический format*Метод 1034 *, который не требует создания объекта MessageFormat.

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

0 голосов
/ 25 июня 2010

Вы уже можете сделать это, используя встроенный Java String класс .

...