Преобразование должно Представить использование в виде строки (“” + <международное значение>) плохая практика?

@GarryShutler

я на самом деле unittest электронная почта при помощи фальшивки smtp (Более мудрый) сервер. Удостоверяется Вы, код приложения корректен:

http://maas-frensch.com/peter/2007/08/29/unittesting-e-mail-sending-using-spring/

Что-то как этот могло, вероятно, быть сделано для других серверов. Иначе необходимо быть в состоянии дразнить API...

BTW: 100%-е покрытие является только началом... просто означает, что весь код имеет на самом деле боб, выполняемый однажды .... ничто о пограничных случаях и т.д.

16
задан MicSim 12 April 2010 в 23:43
поделиться

7 ответов

Я всегда предпочитаю версию String.valueOf : в основном потому, что она показывает, что вы пытаетесь сделать. Целью является не конкатенация строк - это преобразование в строку, «строковое значение i ».

Первая форма также может быть неэффективной - в зависимости от того, обнаруживает ли компилятор то, что вы делаете . В противном случае он может создать новый StringBuffer или StringBuilder и добавить значение, а затем преобразовать его в строку.

Как ни странно, у меня есть статья по этой теме - написано годами и много лет назад; одна из первых статей о Java на моем веб-сайте, IIRC.

34
ответ дан 30 November 2019 в 15:23
поделиться

Независимо от соображений производительности, я считаю, что первый вариант действительно уродлив. ИМХО жаль, что такое «динамическое приведение» возможно даже в Java.

3
ответ дан 30 November 2019 в 15:23
поделиться

Также есть Integer.toString (int i) , что дает вам возможность получить строку также как шестнадцатеричное значение (передав второй параметр 16).

Edit Я только что проверил источник класса String:

public static String valueOf(int i) {
  return Integer.toString(i, 10);
}

И класс Integer:

public static String toString(int i, int radix) {
  if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX)
    radix = 10;

  /* Use the faster version */
  if (radix == 10) {
    return toString(i);
  }
  ...

Если вы вызываете String.valueOf (i) , он вызывает Integer.toString (i, 10) , который затем вызывает Integer. toString (i) .

Итак, Integer.toString (i) должен быть очень незначительно быстрее, чем String.valueOf (i) , поскольку ты' d будет вырезать два вызова функций. (Хотя первый вызов функции может быть оптимизирован компилятором.)

Конечно, для String.valueOf () можно указать аргумент удобочитаемости, поскольку он позволяет вам изменять тип аргумент (и даже обрабатывает нули!), и разница в производительности незначительна.

11
ответ дан 30 November 2019 в 15:23
поделиться

Определенно используйте String.valueOf (i).

Хотя я не уверен в оптимизации на стороне компилятора, худший сценарий, если вы используете "" +:

  1. " "создает новую пустую строку.
  2. " "+ создает StringBuilder (Java 1.5-16)
  3. " "добавляется к StringBuilder, затем

Другими словами, возникает много накладных расходов, если вы используете сложение строк. Вот почему не рекомендуется использовать оператор + для строк в циклах. В общем, по возможности всегда используйте Boolean.valueOf, Integer.valueOf, String.valueOf ... и т. Д. Вы сэкономите как на памяти, так и на накладных расходах.

9
ответ дан 30 November 2019 в 15:23
поделиться

Лично мне не нравится стиль "" + i , но на самом деле это вопрос предпочтений / стандартов кодирования. В идеале компилятор оптимизирует их в эквивалентный код (хотя вам придется декомпилировать, чтобы увидеть, действительно ли это так), но технически, без оптимизации, "" + i более неэффективно, потому что он создает объект StringBuilder, который не требовалось.

0
ответ дан 30 November 2019 в 15:23
поделиться

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

Но на самом деле вы пытаетесь создать объект String из int, а не объединять String с int, поэтому выберите вариант:

String.valueOf(...); 

,

Так что да, ваш первый вариант - плохая практика!

0
ответ дан 30 November 2019 в 15:23
поделиться

Да, ИМХО, это плохая практика.

Это потребует выделения памяти (если компилятор и / или JIT не оптимизируют их). Более того, это сделает менее очевидным то, что пытается делать этот код.

1
ответ дан 30 November 2019 в 15:23
поделиться
Другие вопросы по тегам:

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