Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
Строковые литералы интернируются по умолчанию, так неважно, сколько раз Вы отсылаете к "" в коде, только будет один объект пустой строки. Я не вижу преимущества в объявлении EMPTY_STRING. Иначе Вы могли бы также объявить ОДИН, ДВА, ТРИ, ЧЕТЫРЕ, и т.д. для целочисленных литералов.
, Конечно, если Вы хотите изменить значение EMPTY_STRING позже, удобно иметь его в одном месте;)
Хм, правила являются правильными, но берутся в различном смысле! Позволяет взгляду на причину, во-первых все ссылки на объект в Java проверяются, равняется (). Раньше, на некоторых языках это было сделано с помощью '==' оператор, если случайно кто-то использовал '=' для '==', катастрофа. Теперь вопрос волшебных чисел/констант, для компьютера все константы/числа подобны. Вместо 'международного ONE=1' можно, конечно, использовать 1, но это будет сохраняться для двойного PI = 3.141...? Что происходит, если кто-то пытается изменить точность когда-то позже.
, Если бы мы должны были придумать контрольный список, что правило было бы адресом общее руководство не так ли? Все, что я означаю говорить, - то, что правила, как предполагается, помогают, мы можем, конечно, изогнуть правила только, когда мы знаем их очень хорошо. Здравый смысл преобладает. Как предложил мой друг, константы программы как 0/1, которые обозначают условия выхода, могут быть трудно кодированы, и следовательно принцип магического числа не применяется. Но для те, которые участвуют в логических проверках/правилах, лучше сохраните их как настраиваемые константы.
Мы просто делаем следующее для таких ситуаций:
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.*
Один случай, где действительно имеет смысл иметь константу со значением пустой строки, - имя при получении семантики значения. Например:
if (Constants.FORM_FIELD_NOT_SET.equals(form.getField("foobar"))) {
...
}
Это делает код больше сам документирующий (кроме аргумента, что лучший дизайн должен добавить метод, проверяющий, установлено ли поле на саму форму).
Hehe, забавная вещь: Как только это компилирует, Вы, привычка видит различие (в байт-коде) между "статической заключительной" вещью и строковым литералом, поскольку компилятор Java всегда встраивает "статическую заключительную Строку" в целевой класс. Просто поменяйте свою пустую струну во что-то распознаваемое (как LGPL-текст) и посмотрите на получающийся *.class файл кода это refernces что постоянный. Вы найдете свой текст скопированным в тот файл класса.
Мне не нравится ни один выбор. Почему не if (otherString.length() == 0)
Редактирование: Я на самом деле всегда кодирую
if (otherString == null || otherString.length() == 0)
Я с Вашим коллегой. В то время как пустую строку трудно ввести с опечаткой, можно случайно поместить пространство там, и может быть трудно заметить при сканировании кода. Главный это - хорошая практика, чтобы сделать это со всеми Вашими строковыми константами, которые привыкают больше чем в одном месте - хотя, я склонен делать это на уровне класса, а не как глобальные константы.
FWIW, C# имеет статическую строку свойства. Пустой для просто этой цели и я нахожу, что она улучшает удобочитаемость кода очень.
Ну, я мог предположить также, но я сделал быстрый тест... Почти как обман...
произвольная строка проверяется с помощью различных методов. (несколько повторений)
результаты предполагают, что 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...
Иронически смысл констант должен сделать их легко изменяемыми. Таким образом, если Ваш коллега не планирует переопределить EMPTY_STRING, чтобы быть чем-то другим, чем пустая строка - который был бы действительно глупой вещью сделать - кастинг подлинной фиксированной конструкции такой как "" к константе является плохой вещью.
, Поскольку Dan Dyer говорит, как определение постоянного, чтобы быть 1: это абсолютно бессмысленно и совершенно сбивало бы с толку - потенциально опасный - если кто-то переопределил его.
Я очень предпочитаю видеть EMPTY_STRING.
Это делает его английским языком. "" .equals 'читает' по-другому, чем EMPTY_STRING.equals.
С какой стати Вы хотели бы глобальную переменную в Java? James Gosling действительно пытался избавиться от них; не возвращайте их.
Или
0 == possiblyEmptyString.length()
или
possiblyEmptyString.isEmpty() // Java 6 only
так же ясны.
Тот же аргумент время от времени подходит в.NET (где уже существует статическая полевая строка только для чтения. Пустой). Это - вопрос вкуса - но лично я нахожу "" менее навязчивыми.
Что касается вопроса, я обычно рекомендую использовать служебную функцию, когда на самом деле вы проверяете «отсутствие полезного значения», а не, в частности, пустую строку. В общем, я обычно использую:
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);
Идея состоит в том, что два вышеупомянутых: