Я понимаю, что каждый раз, когда я набираю строковый литерал ""
, в пуле строк указывается один и тот же объект String.
Но почему String API не включает public static final String Empty = "";
, чтобы я мог использовать ссылки на String.Empty
?
Это сэкономит время компиляции, по крайней мере, так как компилятор будет знать, что он ссылается на существующую строку, и не должен проверять, был ли он уже создан для повторного использования, верно? И лично я считаю, что распространение строковых литералов, особенно крошечных, во многих случаях является «запахом кода».
Так что за String.Empty не было Grand Design Reason, или создатели языка просто не разделяли мои взгляды?
outputBlah = ""
и он , вероятно , предпочитаетsomething == String.Empty
более ,something.Length > 0
а также (пропустить проверку нулевой.)String.isEmpty()
функция ... почему вы хотитеString.EMPTY
?String.isEmpty()
не возвращает пустую строку.Ответы:
String.EMPTY
12 символов и""
два, и они оба будут ссылаться на один и тот же экземпляр в памяти во время выполнения. Я не совсем уверен, зачемString.EMPTY
экономить время компиляции, на самом деле я думаю, что это будет последним.Особенно с учетом того, что
String
s являются неизменяемыми, это не значит, что вы можете сначала получить пустую строку и выполнить с ней некоторые операции - лучше всего использоватьStringBuilder
(илиStringBuffer
если вы хотите быть потокобезопасным) и превратить это в строку.Обновление
От вашего комментария к вопросу:
Я считаю, что было бы вполне законно предоставить константу в вашем соответствующем классе:
А затем ссылаться на это как в вашем коде как
Таким образом, по крайней мере, вы явно указываете, что хотите пустую строку, а не забыли заполнить строку в вашей IDE или что-то подобное.
источник
StringBuilder
не говоря о том, что в девяти из десяти случаев совершенно неуместно использовать,StringBuilder
а не объединять.использование
org.apache.commons.lang.StringUtils.EMPTY
источник
""
... и большинство из них, вероятно, будут громко возражать против использования, заEMPTY
исключением особых ситуаций, гдеEMPTY
имеет значение, специфичное для домена. (И в таких случаях, возможно, есть более подходящее имя.)Если вы хотите сравнить с пустой строкой, не беспокоясь о пустых значениях, вы можете сделать следующее.
В конечном счете, вы должны делать то, что считаете верным. Большинство программистов предполагают, что "" означает пустую строку, а не строку, в которую кто-то что-то забыл положить.
Если вы считаете, что есть преимущество в производительности, вы должны проверить его. Если вы не думаете, стоит ли тестировать для себя, это хороший признак того, что оно того не стоит.
Похоже, вы пытаетесь решить проблему, которая была решена, когда язык был разработан более 15 лет назад.
источник
if ("" == text)
if ("" == new String())
ложно Лучший тестif(text.isEmpty())
Если вам действительно нужна константа String.EMPTY, вы можете создать в своем проекте статический финальный класс утилиты с именем «Константы» (например). Этот класс будет поддерживать ваши константы, включая пустую строку ...
В той же идее вы можете создавать константы ZERO, ONE int ... которые не существуют в классе Integer, но, как я прокомментировал, было бы трудно писать и читать:
И т.п.
источник
Apache StringUtils также решает эту проблему.
Недостатки других опций:
Granted StringUtils - это еще одна библиотека, которую можно перетаскивать, но она работает очень хорошо и экономит кучу времени и хлопот, проверяя наличие нулей или изящно обрабатывая NPE.
источник
"".equals(s)
?Не просто говорите, что «пул памяти строк повторно используется в буквальной форме, регистр закрыт». То, что компиляторы делают под капотом, здесь не главное. Вопрос обоснованный, особенно учитывая количество полученных голосов.
Речь идет о симметрии , без этого API труднее использовать для людей. Ранние Java SDK, как известно, игнорировали это правило, и сейчас уже слишком поздно. Вот несколько примеров на моей голове, не стесняйтесь вставить свой «любимый» пример:
источник
Все те
""
литералы являются одним и тем же объектом. Зачем делать все эти дополнительные сложности? Это просто больше текста и менее понятно (стоимость компилятора минимальна). Поскольку строки Java являются неизменяемыми объектами, их вообще никогда не нужно различать, за исключением, возможно, эффективности, но с пустым строковым литералом это не имеет большого значения.Если вы действительно хотите
EmptyString
постоянную, сделайте это сами. Но все, что он будет делать, это поощрять еще более подробный код; не будет никогда какой - либо пользы для этого.источник
x = String.Empty
передает намерение лучше, чемx = ""
. Последнее может быть случайным упущением. Для того, чтобы сказать , что не существует и не какие - либо выгоды неверны.x = String.Empty
передает намерение, правда. Но предположим, что язык предоставляет константуString.Empty
, когда вы сталкиваетесь,x = ""
вы все еще точно знаете о намерении точно так же, как если бы такой константы не было. Вы должны были бы гарантировать, что все места в мире Java-кода, где пустая строка была предназначена, не будут использоваться""
для получения информации, которую вы упоминаете. По иронии судьбы, C # действительно использует константу и поощряет ее использование, поэтому, как я уже сказал, я знаю, что это дискуссия с очень большим мнением.""
должен быть недопустимым, чтобы исключить несчастные случаи. Я шучу!В дополнение к тому, что сказал Ноэль М, вы можете посмотреть на этот вопрос, и этот ответ показывает, что константа используется повторно.
http://forums.java.net/jive/message.jspa?messageID=17122
источник
Я понимаю, что каждый раз, когда я набираю строковый литерал "", в пуле строк указывается один и тот же объект String.
Там нет такой гарантии сделано. И вы не можете полагаться на это в своем приложении, это полностью зависит от JVM.
или создатели языка просто не разделяют мои взгляды?
Ага. Мне кажется, это вещь с очень низким приоритетом.
источник
String username = "Bob" + " " + "Smith";
). Строки, созданные программно, не имеют гарантий интернирования, если вы явно не вызываете,intern()
как вы заявили. Сценарий OP описывает использование пустого строкового литерала""
по всему коду, хотя в этом случае происходит автоматическое интернирование.String a = ""; for(int i = 0; i < 100; i++) {a += "a";} String b = ""; for(int i = 0; i < 100; i++) {b += "b";} a.intern(); b.intern();
Теперь иa
иb
указывают на ту же ячейку памяти в PermGen. Смотрите эту статьюПоздний ответ, но я думаю, что он добавляет что-то новое в эту тему.
Ни один из предыдущих ответов не ответил на оригинальный вопрос. Некоторые пытались оправдать отсутствие постоянной, в то время как другие показали, как мы можем справиться с отсутствием постоянной. Но никто не дал убедительного обоснования в пользу константы, поэтому ее отсутствие до сих пор не объяснено должным образом.
Константа будет полезна, потому что она предотвратит некоторые ошибки кода, оставшиеся незамеченными.
Скажем, у вас большая база кода с сотнями ссылок на "". Кто-то изменяет один из них при прокрутке кода и меняет его на «». Такое изменение будет иметь высокую вероятность остаться незамеченным в производстве, и в этот момент может возникнуть какая-то проблема, источник которой будет сложно обнаружить.
OTOH, библиотечная константа с именем EMPTY, если подвержена той же ошибке, сгенерирует ошибку компилятора для чего-то вроде EM PTY.
Определение вашей собственной константы все еще лучше. Кто-то может все же изменить его инициализацию по ошибке, но из-за его широкого применения воздействие такой ошибки будет гораздо труднее остаться незамеченным, чем ошибка в одном случае использования.
Это одно из основных преимуществ, которые вы получаете от использования констант вместо литеральных значений. Люди обычно признают, что использование константы для значения, используемого в десятках мест, позволяет легко обновить это значение только в одном месте. Что менее часто признается, так это то, что это также предотвращает случайное изменение этого значения, потому что такое изменение будет проявляться повсюду. Так что да, "" короче, чем EMPTY, но EMPTY безопаснее использовать, чем ""
Итак, возвращаясь к первоначальному вопросу, мы можем только предполагать, что разработчики языка, вероятно, не знали об этом преимуществе предоставления констант для литеральных значений, которые часто используются. Надеюсь, однажды мы увидим строковые константы, добавленные в Java.
источник
Для тех, кто претендует
""
иString.Empty
являются взаимозаменяемыми или что""
лучше, вы очень не правы.Каждый раз, когда вы делаете что-то вроде myVariable = ""; вы создаете экземпляр объекта. Если бы Java-объект String имел открытую константу EMPTY, был бы только 1 экземпляр объекта ""
Например: -
10 (11 включая String.EMPTY) указателей на 1 объект
Или: -
10 указателей на 10 объектов
Это неэффективно и во всех крупных приложениях может быть значительным.
Возможно, компилятор Java или среда выполнения достаточно эффективны, чтобы автоматически указывать все экземпляры "" на один и тот же экземпляр, но это может и не потребовать дополнительной обработки для принятия такого решения.
источник
if (text == "")