Ви використовуєте StringUtils.EMPTY
замість ""
?
Я маю на увазі або як повернене значення, або якщо ви встановлюєте значення змінної String. Я не маю на увазі порівняння, тому що там ми використовуємоStringUtils.isEmpty()
Відповіді:
Звичайно, ні. Ви дійсно вважаєте "" недостатньо зрозумілим?
Константи мають, по суті, 3 варіанти використання:
Жодне тут не застосовується.
EMPTY
не несе жодного значення, якого сам порожній рядок ще не має. Найголовніше, це не документує, чому ви вирішили використовувати порожній рядок у цьому конкретному випадку. Це не інакше, як називати константу ONE
і робити вигляд, що був сенс використовувати цю константу замість значення.
Я використовую StringUtils.EMPTY
для приховування літералу, а також для вираження того, що return StringUtils.EMPTY
було повністю очікуваним, і він повинен повернути порожній рядок, ""
може призвести до припущення, яке ""
можна легко перетворити на щось інше, і що це, можливо, була лише помилкою. Я думаю, що EMPTY
це більш виразно.
StringUtils.EMPTY
менш виразним, ніж ""
.
""
виразніше, ніж використання StringUtils.EMPTY
, і те, що ви сказали, не передумало з цього приводу. Я майже можу повірити, що розробники неправильно написали порожній літерал рядка дуже, дуже інколи - але я візьму ясність рядкового літералу за один раз на мільйон (і його легко знайти в тестуванні, сподіваюся ... ) помилка, особисто.
Ні, просто використовуйте ""
.
Буквал ""
ясний, як кришталь. Немає непорозумінь щодо того, що малося на увазі. Я б не знав, навіщо для цього вам потрібна константа класу. Я можу лише припустити, що ця константа використовується у всьому пакеті, що містить StringUtils
замість ""
. Однак це не означає, що ви повинні ним користуватися.
Якщо на тротуарі є камінь, його не потрібно кидати.
Я вражений тим, як багато людей із задоволенням сліпо припускають, що "" насправді є порожнім рядком і не містить (випадково?) Жодного чудового невидимого символу, що не має пробілів. Для любові до всього доброго і пристойного, використовуйте ПУСТО, коли тільки можете.
Я додаю тут свої два центи, тому що я не бачу, щоб хтось говорив про String
інтернування та ініціалізацію класу:
String
літерали в джерелах Java інтернуються, роблячи будь-який ""
і StringUtils.EMPTY
той самий об’єктStringUtils.EMPTY
може ініціалізувати StringUtils
клас, оскільки він отримує доступ до свого статичного члена, EMPTY
лише якщо він не оголошенийfinal
(JLS специфічний для цієї точки). Однак є остаточним, тому він не ініціалізує клас.org.apache.commons.lang3.StringUtils.EMPTY
Дивіться відповідну відповідь щодо інтернування рядків та ініціалізації класу , посилаючись на JLS 12.4.1 .
StringUtils
класу.
Я не дуже люблю користуватися ним, як return "";
і коротше ніж return StringUtils.EMPTY
.
Однак одна помилкова перевага його використання полягає в тому, що якщо ви вводите return " ";
замість return "";
, ви можете зіткнутися з іншою поведінкою (щодо того, правильно ви тестуєте порожній рядок чи ні).
""
, я ненавиджу вводити один і той же буквальний рядок більше одного разу, навіть раз лише іноді. Я вважаю за краще оголосити константи в Constants.java , але не повторювати їх всюди у вихідному коді.
return "";
це потворно, Я ВАЖЛИВИ використовувати return StringUtil.EMPTY
(оголошений у власному класі StringUtil , А НЕ StringUtils Apache ).
Якщо ваш клас не використовує нічого іншого із спільного, тоді буде шкода мати цю залежність саме для цієї магічної цінності.
Дизайнер StringUtils активно використовує цю константу, і це правильно, але це не означає, що вам слід також використовувати її.
Чесно кажучи, я не бачу особливої користі ні від того, ні від іншого. Якщо ви хочете порівняти порожній рядок, просто використовуйтеStringUtils.isNotEmpty(..)
StringUtils.isNotEmpty(..)
також робить нульову перевірку, тому це не зовсім те саме, що порівняння з порожнім рядком.
null
? як 2-й аргумент equals
, але результат буде однаковим -false
isNotEmpty
є протилежністю "".equals(…)
, отже, той факт, що він буде поводитися null
як порожній рядок , відрізняється від порівняння з порожнім рядком, "".equals("")
→ true
, "".equals(null)
→ false
, StringUtils.isNotEmpty("")
→ false
, StringUtils.isNotEmpty(null)
→ false
. Якщо ви просто хочете знати, чи рядок порожній, використовуйте string.isEmpty()
, який має правильну поведінку, повертаючи, true
якщо це порожній рядок, і кидаючи, NullPointerException
якщо рядок є null
...
Я вважаю StringUtils.EMPTY
корисним у деяких випадках для розбірливості. Зокрема з:
Трійковий оператор, напр.
item.getId() != null ? item.getId() : StringUtils.EMPTY;
Також за допомогою константи створюється посилання на StringUtils.EMPTY
. В іншому випадку, якщо ви намагаєтеся створити екземпляр літералу String ""
кожного разу, коли JVM доведеться перевіряти, чи він уже існує в пулі рядків (що, швидше за все, і буде, тому жодних додаткових екземплярів не буде створено). Напевно, використання StringUtils.EMPTY
дозволяє уникнути необхідності перевіряти пул рядків?
StringUtils.EMPTY
константа вирішується під час компіляції.
StringUtil.EMPTY
це константа часу компіляції, посилання на неї компілюється в точно такий же байт-код, що і ""
безпосереднє використання . Крім того, я не розумію, чому тернарний оператор повинен щось змінити. Це вираз, як і будь-який інший. Будь-яка причина використовувати чи не використовувати іменовану константу стосується також і тернарного оператора.
Ні, бо я маю більше писати. І порожній рядок є незалежним від платформи порожнім (на Java).
File.separator
краще, ніж "/" або "\".
Але роби як хочеш. Ви не можете отримати друкарську помилкуreturn " ";
someString.isEmpty()
натомість пишуть розумні програмісти .
Так, це має сенс. Можливо, це не єдиний шлях, але я дуже мало бачу, як сказати це "не має сенсу".
На мою думку:
It will still require changing everywhere if you don't define your own variable and use it in multiple places.
ви збираєтеся змінити порожній рядок на інший порожній рядок?
StringUtils.EMPTY
. Зрозуміло, що використання порожнього рядка призначене, а не якась лінь ("О, для цього потрібен рядок, давайте пройдемо""
"). Якщо хтось вдарить цей фрагмент коду, він двічі подумає, перш ніж вносити зміни. Крім того, якбиStringUtils.EMPTY
було визначено як власну змінну, наприкладMyClass.EMPTY
, для внесення змін до "цього подання порожнечі" потрібно було б змінити один рядок коду. Наприклад, ви можете змінити його на"<empty>"
замість порожнього рядка""
. Але, я думаю, це заходить занадто далеко.