Действительно ли создание является пустой строкой, постоянной стоящий того?

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

24
задан Meneer Venus 16 December 2014 в 10:07
поделиться

14 ответов

Строковые литералы интернируются по умолчанию, так неважно, сколько раз Вы отсылаете к "" в коде, только будет один объект пустой строки. Я не вижу преимущества в объявлении EMPTY_STRING. Иначе Вы могли бы также объявить ОДИН, ДВА, ТРИ, ЧЕТЫРЕ, и т.д. для целочисленных литералов.

, Конечно, если Вы хотите изменить значение EMPTY_STRING позже, удобно иметь его в одном месте;)

65
ответ дан Dan Dyer 28 November 2019 в 22:07
поделиться

Хм, правила являются правильными, но берутся в различном смысле! Позволяет взгляду на причину, во-первых все ссылки на объект в Java проверяются, равняется (). Раньше, на некоторых языках это было сделано с помощью '==' оператор, если случайно кто-то использовал '=' для '==', катастрофа. Теперь вопрос волшебных чисел/констант, для компьютера все константы/числа подобны. Вместо 'международного ONE=1' можно, конечно, использовать 1, но это будет сохраняться для двойного PI = 3.141...? Что происходит, если кто-то пытается изменить точность когда-то позже.

, Если бы мы должны были придумать контрольный список, что правило было бы адресом общее руководство не так ли? Все, что я означаю говорить, - то, что правила, как предполагается, помогают, мы можем, конечно, изогнуть правила только, когда мы знаем их очень хорошо. Здравый смысл преобладает. Как предложил мой друг, константы программы как 0/1, которые обозначают условия выхода, могут быть трудно кодированы, и следовательно принцип магического числа не применяется. Но для те, которые участвуют в логических проверках/правилах, лучше сохраните их как настраиваемые константы.

0
ответ дан questzen 28 November 2019 в 22:07
поделиться

Мы просто делаем следующее для таких ситуаций:

public class StaticUtils
{
    public static boolean empty(CharSequence cs)
    {
        return cs == null || cs.length() == 0;
    }

    public static boolean has(CharSequence cs)
    {
        return !empty(cs);
    }
}

Тогда всего import static StaticUtils.*

1
ответ дан Stephan 28 November 2019 в 22:07
поделиться
  1. да - это не предлагает преимущества.
  2. зависит от того, к чему Вы привыкли, я уверен.
  3. нет, это - просто константа - не злоупотребление.
2
ответ дан Bill K 28 November 2019 в 22:07
поделиться

Один случай, где действительно имеет смысл иметь константу со значением пустой строки, - имя при получении семантики значения. Например:

if (Constants.FORM_FIELD_NOT_SET.equals(form.getField("foobar"))) {
    ...
}

Это делает код больше сам документирующий (кроме аргумента, что лучший дизайн должен добавить метод, проверяющий, установлено ли поле на саму форму).

2
ответ дан ddimitrov 28 November 2019 в 22:07
поделиться

Hehe, забавная вещь: Как только это компилирует, Вы, привычка видит различие (в байт-коде) между "статической заключительной" вещью и строковым литералом, поскольку компилятор Java всегда встраивает "статическую заключительную Строку" в целевой класс. Просто поменяйте свою пустую струну во что-то распознаваемое (как LGPL-текст) и посмотрите на получающийся *.class файл кода это refernces что постоянный. Вы найдете свой текст скопированным в тот файл класса.

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

Мне не нравится ни один выбор. Почему не if (otherString.length() == 0)

Редактирование: Я на самом деле всегда кодирую

if (otherString == null || otherString.length() == 0)
3
ответ дан David G 28 November 2019 в 22:07
поделиться

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

FWIW, C# имеет статическую строку свойства. Пустой для просто этой цели и я нахожу, что она улучшает удобочитаемость кода очень.

4
ответ дан tvanfosson 28 November 2019 в 22:07
поделиться

Ну, я мог предположить также, но я сделал быстрый тест... Почти как обман...

произвольная строка проверяется с помощью различных методов. (несколько повторений)

результаты предполагают, что isEmpty () и быстрее и действительно более читаем; Если isEmpty () не доступен, длина () является хорошей альтернативой.

Используя константу, вероятно, не стоит того.

"".equals(someString())      :24735 ms
t != null && t.equals("")    :23363 ms
t != null && t.equals(EMPTY) :22561 ms
EMPTY.equals(someString())   :22159 ms
t != null && t.length() == 0 :18388 ms
t != null && t.isEmpty()     :18375 ms
someString().length() == 0   :18171 ms

В этом сценарии;

"IAmNotHardCoded".equals(someString())

я предложил бы определить константу в r e l e v n t место, так как глобальный класс для всех констант действительно сосет. Если нет никакого соответствующего места, Вы, вероятно, делаете что-то еще неправильно...

Customer.FIELD_SHOE_SIZE //"SHOE_SIZE"

Мог бы считаться соответствующим местом где как;

CommonConstants.I__AM__A__LAZY__PROGRAMMER // true

не.

Для BigIntegers и подобной вещи, я склонен заканчивать тем, что определил заключительные помехи локально; как:

private final static BigDecimal ZERO = new BigDecimal(0);
private final static BigDecimal B100 = new BigDecimal("100.00");

Thats прослушивает меня и не был бы он быть любезным с небольшим количеством сахара для BigInts и BigDecimals...

6
ответ дан 28 November 2019 в 22:07
поделиться

Иронически смысл констант должен сделать их легко изменяемыми. Таким образом, если Ваш коллега не планирует переопределить EMPTY_STRING, чтобы быть чем-то другим, чем пустая строка - который был бы действительно глупой вещью сделать - кастинг подлинной фиксированной конструкции такой как "" к константе является плохой вещью.

, Поскольку Dan Dyer говорит, как определение постоянного, чтобы быть 1: это абсолютно бессмысленно и совершенно сбивало бы с толку - потенциально опасный - если кто-то переопределил его.

7
ответ дан David Arno 28 November 2019 в 22:07
поделиться

Я очень предпочитаю видеть EMPTY_STRING.

Это делает его английским языком. "" .equals 'читает' по-другому, чем EMPTY_STRING.equals.

7
ответ дан shelfoo 28 November 2019 в 22:07
поделиться

С какой стати Вы хотели бы глобальную переменную в Java? James Gosling действительно пытался избавиться от них; не возвращайте их.

Или

0 == possiblyEmptyString.length()

или

possiblyEmptyString.isEmpty() // Java 6 only

так же ясны.

16
ответ дан Douglas Squirrel 28 November 2019 в 22:07
поделиться

Тот же аргумент время от времени подходит в.NET (где уже существует статическая полевая строка только для чтения. Пустой). Это - вопрос вкуса - но лично я нахожу "" менее навязчивыми.

2
ответ дан Jon Skeet 28 November 2019 в 22:07
поделиться

Что касается вопроса, я обычно рекомендую использовать служебную функцию, когда на самом деле вы проверяете «отсутствие полезного значения», а не, в частности, пустую строку. В общем, я обычно использую:

import org.apache.commons.lang.StringUtils;

// Check if a String is whitespace, empty ("") or null.
StringUtils.isBlank(mystr); 
// Check if a String is empty ("") or null.
StringUtils.isEmpty(mystr); 

Идея состоит в том, что два вышеупомянутых:

  • Проверяют различные другие случаи, включая нулевую безопасность, и (что более важно)
  • Передают то, что вы пытаетесь проверить, скорее чем как это проверить.
3
ответ дан 28 November 2019 в 22:07
поделиться
Другие вопросы по тегам:

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