Рекомендуется ли StringUtils.EMPTY?

Вы используете StringUtils.EMPTY вместо ""?

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


person keuleJ    schedule 04.11.2010    source источник


Ответы (12)


Конечно нет. Вы действительно думаете, что "" недостаточно ясно?

Константы имеют по существу 3 варианта использования:

  1. Документировать значение значения (с именем константы + javadoc)
  2. Синхронизируйте клиентов по общему значению.
  3. Предоставьте ярлык для специального значения, чтобы избежать некоторых затрат на инициализацию

Никакие не применимы здесь.

person David Pierre    schedule 04.11.2010
comment
Я все еще вижу один второстепенный и редкий вариант использования StringUtils.EMPTY. Дает понять, что предполагается использование пустой String, а не какая-то лень (О, для этого нужна String, давайте пропустим ""). Если кто-то наткнется на этот фрагмент кода, он дважды подумает, прежде чем вносить изменения. Кроме того, если бы StringUtils.EMPTY было определено как ваша собственная переменная, например MyClass.EMPTY, внесение изменений в это представление пустоты потребовало бы изменения одной строки кода. Вы можете, например, изменить его на "<empty>" вместо пустой строки "". Но я думаю, что это заходит слишком далеко. - person Timmos; 22.01.2014
comment
Наконец-то у меня есть вменяемый аргумент, на который я могу направить фанатиков, вместо того, чтобы каждый раз думать самостоятельно. Спасибо. - person Alex; 15.12.2015
comment
Почему в EMPTY отсутствует смысл? EMPTY удовлетворяет как 1, так и 2 в вашем списке. Опытные разработчики сильно недооценивают вероятность того, что младшие разработчики испортят что-то такое простое, как использование . - person Andrew T Finnell; 27.07.2018
comment
@AndrewTFinnell имя EMPTY не имеет никакого значения, которого уже не имеет сама пустая строка. В частности, в нем не указано, почему вы решили использовать пустую строку в данном конкретном случае. Это то же самое, что назвать константу ONE и притвориться, что есть смысл использовать эту константу вместо значения. - person Holger; 11.09.2018
comment
Проголосовал против только потому, что нет, я на самом деле не думаю, что это достаточно ясно :( Оно пустое? Оно пустое? Там есть место, которое я не вижу, потому что у меня маленький размер шрифта? Он должен был быть пустым Есть ли странные невидимые символы? - person Dan Rayson; 11.09.2018
comment
да вообще непонятно. его трудно читать и легко пропустить. - person Mubashar; 03.06.2019
comment
для всех, кто сказал, что "" легко пропустить, у вас нет других строковых констант? как вы спите по ночам, зная, что в конце любого из них может быть лишний пробел? - person Pita; 17.08.2020

Я использую StringUtils.EMPTY для сокрытия литерала, а также для того, чтобы показать, что return StringUtils.EMPTY было полностью ожидаемо и должна возвращать пустую строку, "" может привести к предположению, что "" можно легко изменить на что-то другое, и что это, возможно, была всего лишь ошибка. Я думаю, что EMPTY более выразительный.

person Christopher Klewes    schedule 04.11.2010
comment
Согласно другим, которые предложили это: вы также используете ZERO для 0 и ONE для 1? - person Jon Skeet; 04.11.2010
comment
Я бы не стал сравнивать специальный «пустой» случай с использованием целочисленного литерала. - person Christopher Klewes; 04.11.2010
comment
Я нахожу StringUtils.EMPTY менее выразительным, чем "". - person bacar; 26.09.2013
comment
@JonSkeet Большое вам уважение. Я чувствую, что вы не правы здесь. Хотя вы и я, возможно, никогда не столкнемся с этим, есть основания не использовать литерал, поскольку он не обеспечивает проверку синтаксиса, если разработчик его испортит. И да, я видел, как младшие разработчики испортили такие простые вещи, как . Я не верю в идею когда-либо менять значение EMPTY на что-то другое, кроме . Мне нравится идея EMPTY только тем, что компилятор может понять ее значение. - person Andrew T Finnell; 27.07.2018
comment
@AndrewTFinnell: «Неправильный» - странный термин для обозначения того, что, безусловно, должно быть субъективным. Нет, я не ожидаю, что EMPTY когда-либо изменит значение, но я, как и bacar, нахожу "" более выразительным, чем использование StringUtils.EMPTY, и то, что вы сказали, не изменило моего мнения по этому поводу. Я почти могу поверить, что разработчики неправильно записали пустой строковый литерал очень, очень редко, но я возьму ясность строкового литерала за один раз на миллион (и легко найти в тестировании, надеюсь...) ошибка, лично. - person Jon Skeet; 27.07.2018
comment
@JonSkeet Совершенно верно. Это субъективно. Я бы никогда не использовал StringUtils.EMPTY, так как вы можете статически импортировать в EMPTY. Я ценю краткость «». Я не верю в то, что компилятор может уловить EMPTY как неправильный по сравнению с « », чтобы быть субъективным. - person Andrew T Finnell; 27.07.2018
comment
@Andrew: Нет, но относительная важность этого по сравнению с тем, что я считаю лучшей читабельностью, субъективна. (Меня не слишком беспокоит возможность, которую я никогда не видел в дикой природе. Я видел, как отсутствие наручников вызывает жуков, я ожидаю, что видел все виды вещей, но никогда этого. Так что я утверждаю, что это, по крайней мере, исчезающе редко, по крайней мере, с коллегами, с которыми я работал.) - person Jon Skeet; 28.07.2018

Нет, просто используйте "".

Буквальное "" ясно как кристалл. Нет никакого недопонимания относительно того, что имелось в виду. Я бы не знал, зачем вам нужна константа класса для этого. Я могу только предположить, что эта константа используется во всем пакете, содержащем StringUtils вместо "". Однако это не означает, что вы должны его использовать.

Если на тротуаре есть камень, вам не нужно его бросать.

person Erick Robertson    schedule 04.11.2010
comment
Если на тротуаре есть камень, вам не нужно его бросать. Скажи это моему 6-летнему сыну. - person roel; 28.09.2017

Я поражен тем, как много людей счастливы вслепую предположить, что "" действительно является пустой строкой и не содержит (случайно?) каких-либо замечательных невидимых и не пробельных символов Unicode. Ради всего хорошего и приличного используйте EMPTY всякий раз, когда можете.

person j__m    schedule 25.09.2016
comment
Мне любопытно - вы когда-нибудь видели, как это происходит в коде? Если да, то случайно или намеренно? Казалось бы, это сложно сделать случайно, а если специально, то я мог бы так же легко создать свой собственный класс StringUtils с непустой константой EMPTY и ссылаться на него. - person Ian Robertson; 29.09.2017
comment
@IanRobertson Да, я видел, как это происходит. На самом деле довольно часто. Люди постоянно копируют и вставляют с веб-сайтов и из одного набора кодов в другой набор кодов. Есть также компании, которые все еще используют Clear Case, который использует архаичный набор кодов, который затем слепо переводится в набор Windows ISO, а затем переводится в UTF-8, если вы переходите на Git. Я провел бессчетное количество часов, исправляя проблемы с набором кодов. В том числе и этот. - person Andrew T Finnell; 27.07.2018
comment
@AndrewTFinnell Я, конечно, вижу, как в целом это может вызвать проблемы. Но как часто вы видели непустую константу String, выглядящую как пустая? - person Ian Robertson; 28.07.2018

Я добавлю здесь свои два цента, потому что я не вижу, чтобы кто-нибудь говорил о String интернирование и инициализация класса:

  • Все литералы String в исходных кодах Java интернированы, что делает любые "" и StringUtils.EMPTY одним и тем же объектом.
  • Использование StringUtils.EMPTY может инициализировать класс StringUtils, поскольку он обращается к своему статическому члену EMPTY только в том случае, если он не объявлен final (JLS специфичен в этом отношении). Однако org.apache.commons.lang3.StringUtils.EMPTY является окончательным, поэтому он не будет инициализировать класс.

См. связанный ответ на интернирование строк и на Инициализация класса со ссылкой на JLS 12.4.1.

person Matthieu    schedule 22.04.2016
comment
«только если оно не объявлено окончательным», поэтому, поскольку это поле объявлено окончательным, доступ к нему не может привести к инициализации класса StringUtils. - person Holger; 06.11.2019
comment
@Holger это было общее утверждение, но на самом деле я отредактировал ссылку на javadoc, показывающую, что он является окончательным (и, следовательно, не будет инициализировать класс). - person Matthieu; 06.11.2019

Мне не очень нравится его использовать, так как return ""; короче, чем return StringUtils.EMPTY.

Однако одно ложное преимущество его использования заключается в том, что если вы введете return " "; вместо return "";, вы можете столкнуться с другим поведением (относительно того, правильно ли вы тестируете пустую строку или нет).

person Romain Linsolas    schedule 04.11.2010
comment
Вы когда-нибудь замечали, что это на самом деле является проблемой (случайно используя то, что вы имели в виду)? Лично я нахожу буквальное более читаемым, и оно никогда не вызывало у меня никаких проблем. - person Jon Skeet; 04.11.2010
comment
@Jon Нет, конечно, но я пытался найти преимущество в его использовании;) - person Romain Linsolas; 04.11.2010
comment
Нет правила равного времени. Если нет преимущества, то нет преимущества. - person Erick Robertson; 04.11.2010
comment
Мне также не нравится "", я ненавижу вводить одну и ту же литеральную строку более одного раза, даже иногда только один раз. Я предпочитаю объявлять константы в Constants.java, но не повторять их повсюду в исходном коде. - person xenophōn; 30.01.2018
comment
Я ДУМАЮ return ""; уродливым, я ПРЕДПОЧИТАЮ использовать return StringUtil.EMPTY (объявленный в моем собственном классе StringUtil, а НЕ в StringUtils). - person xenophōn; 30.01.2018

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

Разработчик StringUtils интенсивно использует эту константу, и это правильно, но это не значит, что вы должны использовать ее также.

person cherouvim    schedule 04.11.2010
comment
Я имел в виду, что это приемлемо, поскольку автор решил пойти по этому пути (избегать использования магических значений). Хотя он должен быть частным. - person cherouvim; 04.11.2010
comment
Автор часто использует 0 в коде. Было бы лучше, если бы они также определили константу int ZERO = 0? Если нет, то какая разница? - person Jon Skeet; 04.11.2010
comment
Это зависит от контекста. Если бы это был FCKEditorStringUtils, их EMPTY был бы ‹p› ‹/p›, и я бы предпочел повторное использование EMPTY вместо того, чтобы копировать это магическое значение повсюду в классе. Таким образом, под EMPTY они, вероятно, подразумевают EMPTY_CONTENT, а не EMPTY_STRING (поэтому ваш пример с ZERO немного несправедлив). Не могли бы вы повторно использовать константу ERROR_VISA_INVALID=0? - person cherouvim; 04.11.2010

Я нахожу StringUtils.EMPTY полезным в некоторых случаях для удобочитаемости. В частности, с:

  1. Тернарный оператор, например.

    item.getId() != null ? item.getId() : StringUtils.EMPTY;
    
  2. Возврат пустой строки из метода, чтобы подтвердить, что да, я действительно хотел это сделать.

Также с помощью константы создается ссылка на StringUtils.EMPTY. В противном случае, если вы попытаетесь создать экземпляр строкового литерала "" каждый раз, когда JVM придется проверять, существует ли он уже в пуле строк (что, скорее всего, будет, поэтому никаких дополнительных затрат на создание экземпляра). Конечно, использование StringUtils.EMPTY избавляет от необходимости проверять пул строк?

person Tom    schedule 11.03.2011
comment
Ваш аргумент с множественными поисками не работает. В главе 13.4.9 Спецификации языка Java 3.0 упоминается, что константа StringUtils.EMPTY разрешается во время компиляции. - person Roland Illig; 02.01.2014
comment
Существование в пуле строк проверяется во время компиляции и во время загрузки класса, а не во время выполнения каждый раз, когда вы выполняете такой оператор, - person user207421; 25.09.2016
comment
Поскольку StringUtil.EMPTY является константой времени компиляции, ссылка на нее компилируется точно в тот же байт-код, что и при непосредственном использовании "". Кроме того, я не понимаю, почему тернарный оператор должен иметь какое-то значение. Это выражение, как и любое другое. Любая причина использовать или не использовать именованную константу относится и к тернарному оператору. - person Holger; 18.05.2018

Честно говоря, я не вижу особой пользы ни от того, ни от другого. Если вы хотите сравнить с пустой строкой, просто используйте StringUtils.isNotEmpty(..)

person Bozho    schedule 04.11.2010
comment
StringUtils.isNotEmpty(..) также выполняет проверку на ноль, так что это не совсем то же самое, что сравнение с пустой строкой. - person cherouvim; 04.11.2010
comment
и как ты будешь null ? в качестве 2-го аргумента equals, но результат будет тот же - false - person Bozho; 04.11.2010
comment
isNotEmpty является противоположностью "".equals(…), поэтому тот факт, что он будет обрабатывать null как пустую строку, отличается от сравнения с пустой строкой, "".equals("")true, "".equals(null)false, StringUtils.isNotEmpty("")false, StringUtils.isNotEmpty(null)false. Если вы просто хотите узнать, пуста ли строка, используйте string.isEmpty(), который имеет правильное поведение: возвращает true, если это пустая строка, и выдает NullPointerException, если строка null - person Holger; 18.05.2018

Нет, потому что мне еще есть что написать. А пустая строка является независимой от платформы пустой (в Java).

File.separator лучше, чем "/" или "\".

Но делай как хочешь. Вы не можете получить опечатку типа return " ";

person Christian Kuetbach    schedule 04.11.2010
comment
Я совершенно не понимаю, почему большинство программистов так боятся писать слишком много. Написав StringUtils.EMPTY, вы получите самокомментирующий код, который будет легче читать. А согласно Стиву МакКоннеллу (или какому-то исследованию, которое он цитировал в Code Complete 2.0), код читается в 7 раз чаще, чем пишется. - person Paweł Dyda; 04.11.2010
comment
Вы особенно правы, НО: .equals(someString) так же легко читать, как StringUtils.EMPTY.equals(someString) - person Christian Kuetbach; 04.11.2010
comment
StringUtils.EMPTY.equals(someString) приведет к синтаксической ошибке, если вы напишите ее неправильно. .equals(someString) не будет. Это единственная причина, по которой нужно использовать EMPTY. - person Andrew T Finnell; 27.07.2018
comment
@AndrewTFinnell, вот почему нормальные программисты вместо этого пишут someString.isEmpty(). - person Holger; 06.11.2019

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

Если в вашей команде есть люди со всего мира и, возможно, некоторые из них не очень опытны, то было бы неплохо настоять на использовании этой константы в коде.

Вокруг много разных языков, и люди используют свои собственные настройки местного алфавита на своих компьютерах. Иногда они просто забывают переключиться назад при кодировании, и после того, как они переключаются и удаляют с помощью Backspace, текстовый редактор может оставить какой-то мусор внутри . Использование StringUtils.EMPTY просто устранит этот риск.

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

person Saša    schedule 15.12.2020

Да, это имеет смысл. Возможно, это не единственный путь, но я мало что вижу в том, чтобы сказать, что это «не имеет смысла».

По моему мнению:

  • Он выделяется больше, чем «».
  • Это объясняет, что вы имели в виду пустой, и этот пробел, скорее всего, не подойдет.
  • Это все равно потребует изменений везде, если вы не определите свою собственную переменную и не будете использовать ее в нескольких местах.
  • Если вы не разрешаете свободные строковые литералы в коде, это помогает.
person Oron    schedule 24.10.2019
comment
It will still require changing everywhere if you don't define your own variable and use it in multiple places. вы собираетесь изменить пустую строку на другую пустую строку? - person Pita; 17.08.2020
comment
@Pita Извините, это была плохая формулировка. Я хотел сказать, что если вы используете это встроенное вместо того, чтобы вы все равно не получите тех же преимуществ, что и определение собственной константы и повторное использование в нескольких местах. Это не аргумент в пользу StringUtils.EMPTY, это объяснение, которое вы не получите, даже если оно «имеет смысл». Лично я бы создал константу с описательным именем, а затем либо присвоил бы это. Я видел несколько случаев, когда разработчик намеревался использовать один пробел, а в итоге получил пустую строку, чего не происходит с этой формой. - person Oron; 19.08.2020