Это - лучшая практика для использования String.format по конкатенации строк в Java?

Как говорит Джоша Блох в книге « Эффективная Java », null является ключевым словом Java.

Это слово идентифицирует область памяти без указателя на любую другую область памяти: по моему мнению, лучше кодировать с разделением поведения относительно функциональной области (пример: вы ждете объект вида A но вы получаете объект типа B ) и поведение домена низкого уровня (пример: недоступность памяти).

В вашем примере я бы изменил код следующим образом:

public Object getObject(){
  Object objectReturned=new Object();
  try{
    /**business logic*/
  }
  catch(Exception e){
    //logging and eventual logic leaving the current ojbect (this) in a consistent state
  }
  return objectReturned;
}

Недостатком является создание полного объекта при каждом вызове getObject () (тогда в ситуации, когда объект возвращается не читается и не записывается).

Но я предпочитаю иметь тот же объект бесполезным, чем NullPointerException , потому что иногда это исключение очень трудно исправить.

252
задан tgr 18 April 2019 в 00:18
поделиться

5 ответов

Я бы посоветовал лучше использовать String.format () . Основная причина заключается в том, что String.format () может быть более легко локализован с текстом, загруженным из файлов ресурсов, тогда как конкатенация не может быть локализована без создания нового исполняемого файла с другим кодом для каждого языка.

Если вы планируете локализовать свое приложение, вы также должны выработать привычку указывать позиции аргументов для ваших токенов формата:

"Hello %1$s the time is %2$t"

Затем его можно локализовать и поменять местами токены имени и времени, не требуя перекомпиляции исполняемого файла для учета для разного заказа. С позициями аргументов вы также можете повторно использовать тот же аргумент, не передавая его в функцию дважды:

String.format("Hello %1$s, your name is %1$s and the time is %2$t", name, time)
226
ответ дан 23 November 2019 в 02:52
поделиться

Я не проводил никаких конкретных тестов, но думаю, что конкатенация может быть быстрее. String.format () создает новый Formatter, который, в свою очередь, создает новый StringBuilder (с размером всего 16 символов). Это изрядно накладные расходы, особенно если вы форматируете более длинную строку и StringBuilder постоянно вынужден изменять размер.

Однако конкатенация менее полезна и ее труднее читать. Как всегда, стоит провести тест вашего кода, чтобы увидеть, что лучше. Различия могут быть незначительными в серверном приложении после того, как ваши пакеты ресурсов, локали и т. Д. Загружены в память и код JITted.

Возможно, в качестве наилучшей практики было бы неплохо создать свой собственный форматировщик с правильным размером StringBuilder (Appendable) и Locale и используйте их, если вам нужно выполнить много форматирования.

2
ответ дан 23 November 2019 в 02:52
поделиться

Какой из них более читабелен, зависит от того, как работает ваша голова.

Вы получили свой ответ прямо здесь.

Это дело личного вкуса.

Я полагаю, что конкатенация строк немного быстрее, но этим можно пренебречь.

17
ответ дан 23 November 2019 в 02:52
поделиться

String.format () - это больше, чем просто конкатенация строк. Например, вы можете отображать числа в определенной локали, используя String.format () .

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

6
ответ дан 23 November 2019 в 02:52
поделиться

Я провел еще несколько исследований по этому вопросу и обнаружил, что методы equals () и hashcode () также перезаписываются.

Очевидно, что единственной причиной этого может быть добавление javadoc - может быть, поэтому итератор () также был перезаписан.

-121--2402917-

Вот версия, которую я выяснил, используя ссылку hobodave:

class Fish
  class << self
    attr_accessor :var
  end

  @var = 'fish'
  def v
    self.class.var
  end
end

class Trout < Fish
  @var = 'trout'
end

class Salmon < Fish
  @var = 'salmon'
end

puts (Trout.new).v   # => trout
puts (Salmon.new).v  # => salmon

Обратите внимание, что подкласс требует только добавления @ var - нет необходимости переопределять инициализацию.

-121--1617040-

О производительности:

public static void main(String[] args) throws Exception {      
  long start = System.currentTimeMillis();
  for(int i = 0; i < 1000000; i++){
    String s = "Hi " + i + "; Hi to you " + i*2;
  }
  long end = System.currentTimeMillis();
  System.out.println("Concatenation = " + ((end - start)) + " millisecond") ;

  start = System.currentTimeMillis();
  for(int i = 0; i < 1000000; i++){
    String s = String.format("Hi %s; Hi to you %s",i, + i*2);
  }
  end = System.currentTimeMillis();
  System.out.println("Format = " + ((end - start)) + " millisecond");
}

Результаты синхронизации следующие:

  • Конкатенация = 265 миллисекунда
  • Формат = 4141 миллисекунда

Поэтому конкатенация намного быстрее, чем String.format.

158
ответ дан 23 November 2019 в 02:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: