Рекомендуется ли StringUtils.EMPTY? - PullRequest
80 голосов
/ 04 ноября 2010

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

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

Ответы [ 10 ]

97 голосов
/ 04 ноября 2010

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

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

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

Здесь не применимо.

49 голосов
/ 04 ноября 2010

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

24 голосов
/ 04 ноября 2010

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

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

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

10 голосов
/ 25 сентября 2016

Я поражен тем, как много людей счастливы слепо предположить, что "" действительно пустая строка и не содержит (случайно?) Ни одного из замечательных невидимых и не пробельных символов Юникода. Для любви ко всему хорошему и порядочному, используйте ПУСТОЙ, когда можете.

10 голосов
/ 22 апреля 2016

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

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

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

8 голосов
/ 04 ноября 2010

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

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

4 голосов
/ 04 ноября 2010

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

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

1 голос
/ 11 марта 2011

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

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

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

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

1 голос
/ 04 ноября 2010

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

1 голос
/ 04 ноября 2010

Нет, потому что мне нужно больше писать. И empty String не зависит от платформы empty (в Java).

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

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

...