Почему в Java нет String.Empty?

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

Но почему нет t String API включает в себя публичную статическую финальную строку String Empty = ""; , поэтому я могу использовать ссылки на String.Empty ?

. Это сэкономит время компиляции во время по крайней мере, поскольку компилятор будет знать, что он ссылается на существующую строку, и не должен проверять, был ли он уже создан для повторного использования, верно? И лично я считаю, что распространение строковых литералов, особенно крошечных, во многих случаях является «запахом кода».

Так что за String.Empty была грандиозная причина разработки, или создатели языка просто не разделяли мои взгляды? ?

235
задан MC Emperor 21 October 2019 в 01:44
поделиться

7 ответов

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

Особенно учитывая, что String являются неизменяемыми, это не похоже на то, что вы можете сначала получить пустую строку и выполнить с ней некоторые операции - лучше всего использовать StringBuilder (или StringBuffer , если вы хотите быть потокобезопасным) и превратите его в String.

Обновление
Из вашего комментария к вопросу:

Что вдохновило на это, на самом деле TextBox.setText ("");

Я считаю, что было бы вполне законно предоставить константу в вашем соответствующем классе:

private static final String EMPTY_STRING = "";

А затем ссылаться на нее, как в вашем коде, как

TextBox.setText(EMPTY_STRING);

По крайней мере, так вы явно заявляете, что хотите пустую строку, а не забыли заполнить ее в своей среде IDE или что-то подобное.

175
ответ дан 23 November 2019 в 03:28
поделиться

Apache StringUtils также решает эту проблему.

Недостатки других опций:

  • isEmpty () - не является нулевым безопасным. Если строка имеет значение NULL, выдает NPE
  • length () == 0 - опять же небезопасно для NULL. Также не учитывает строки с пробелами.
  • Сравнение с константой EMPTY - май не быть нулевым безопасным. Проблема с пробелами

Разрешено StringUtils - это еще одна библиотека, которую нужно перетаскивать, но она работает очень хорошо и экономит массу времени и избавляет от лишних хлопот, проверяя наличие нулей или изящно обрабатывая NPE.

7
ответ дан 23 November 2019 в 03:28
поделиться

Если вам действительно нужна константа String.EMPTY, вы можете создать служебный статический конечный класс с именем «Константы» (например) в своем проекте. Этот класс будет поддерживать ваши константы, включая пустую строку ...

По той же идее вы можете создавать константы ZERO, ONE int ... которых нет в классе Integer, но, как я уже сказал, это было бы Больно писать и читать:

for(int i=Constants.ZERO; ...) {
    if(myArray.length > Constants.ONE) {
        System.out.println("More than one element");
    }
}

Etc.

7
ответ дан 23 November 2019 в 03:28
поделиться

Все эти "" литералы являются одним и тем же объектом. Зачем делать все эти дополнительные сложности? Просто он длиннее и менее понятен (затраты компилятора минимальны). Поскольку строки Java являются неизменяемыми объектами, нет никакой необходимости различать их, за исключением, возможно, соображений эффективности, но с пустым строковым литералом это не имеет большого значения.

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

5
ответ дан 23 November 2019 в 03:28
поделиться

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

или создатели языка просто не разделяли моих взглядов?
Ага. Мне это кажется очень второстепенным.

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

В дополнение к сказанному Ноэлем М, вы можете посмотреть на этот вопрос, и этот ответ показывает, что константа используется повторно.

http://forums.java.net/jive/message.jspa?messageID=17122

Строковые константы всегда "интернированы" так что нет нужды в таком постоянный.

 Строка s = ""; Строка t = ""; логическое b = s == t; // истинный
3
ответ дан 23 November 2019 в 03:28
поделиться

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

if ("".equals(text))

В конечном счете вы должны делать то, что считаете наиболее ясным. Большинство программистов предполагают, что "" означает пустую строку, а не строку, в которую кто-то что-то забыл вставить.

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

Похоже, вы пытаетесь решить проблему, которая была решена при разработке языка более 15 лет назад.

27
ответ дан 23 November 2019 в 03:28
поделиться
Другие вопросы по тегам:

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