Очевидно, что одним из величайших банов программирования Java является nulls и исключение null-указателя. Какие шаблоны дизайна существуют, которые не добавляют слишком много к вашему коду, но уменьшают проблему исключений нулевого указателя песка?
Какие хорошие легкие шаблоны проектирования для исключения нулей в Java?
Ответ 1
Образец нулевого объекта. Посмотрите Optional класс из google-guava library.
Их wiki имеет статью об использовании и исключении нулей.
Ответ 2
Лучший шаблон дизайна для всех - Неверный идентификатор
if(obj != null) {
...
}
Ответ 3
Просто привыкнуть к возврату нулевых объектов в ваши методы.
public MyObject bohemianRhapsody(){
try {
if(isThisTheRealLife())
return new MyObject("is this just fantasy");
else
return new MyObject("caught in a landslide, no escape from reality");
} catch(ExampleCatchableException e){
return new MyObject(""); // instead of return null
}
}
...
System.out.println(bohemianRhapsody()); // will never print null
Также (вид), называемый шаблон Null-Object.
Ответ 4
Почему вы хотите избежать исключения из null-указателя? Получение null
при ожидании чего-то другого является одним из первых признаков того, что что-то не так, когда вы пишете код. Такие вещи, как Null Object Pattern
, должны использоваться, если вы уверены, что это достаточно. Одним из самых больших недостатков дизайна является их злоупотребление\неправильное использование.
EDIT:
Я думаю, что лучший способ уменьшить null-возврат - увеличить использование исключений. Подумайте о том, что List возвращает нулевой объект при попытке доступа к элементу с индексом -1, вы будете использовать такие вещи, как
if( list.get(-1).equals(nullObject))
что еще хуже. Я считаю, что лучше возбуждать исключение, когда аргументы являются неожиданными или несовместимыми.
Ответ 5
Есть несколько полезных аннотаций, предназначенных для этих целей IntellyJ: @Nullable и @NotNull
Обнаружение вероятных NPE
Ответ 6
Я думаю, это вопрос вкуса, но я бы сказал, что самые большие баны таких языков, как Smalltalk/ Objective-C, состоят в том, что они НЕ имеют нулевого значения и что там НЕ какие-либо NullPointerExceptions. Я не поклонник "шаблона нулевого объекта", на самом деле я ненавижу его со страстью, поскольку я нахожу, что он устраняет проблемы и находит ошибки намного сложнее без какой-либо реальной выгоды. Null
имеет значение (часто плохое) и не должно рассматриваться как любое другое общее состояние.
Как упоминалось в этой теме, NPE действительно мощные и хороший способ уловить синтаксические ошибки или плохое кодирование на ранней стадии, а if (obj != null)
- довольно прямолинейно. Если ваше приложение начинает генерировать NPE во время выполнения, вы сделали что-то не так, и вам нужно его исправить. Не пытайтесь скрыть исключение, исправить все, что есть ПРИЧИНА исключения.
Ответ 7
"something definetly not null".equals(maybeNullVar)
vs
maybeNullVar.equals("something definetly not null")
Ответ 8
Эти методы (см. также Apache commons-lang) могут уменьшить нагрузку на нулевые проверки в случаях обработки строк, инкапсулируя их в методы, которые сохраняют семантический смысл кода:
public static boolean isBlank(final String str)
{
return (str == null) || str.isEmpty();
}
public static boolean isNotBlank(final String str)
{
return !StringUtils.isBlank(str);
}
public static boolean isEqual(final String s1, final String s2)
{
if (s1 == s2) { return true; }
if ((s1 == null) || (s2 == null)) { return false; }
return s1.equals(s2);
}
public static boolean isNotEqual(final String s1, final String s2)
{
return !StringUtils.isEqual(s1, s2);
}
Ответ 9
Вам не нужно использовать шаблон дизайна.
Просто инициализируйте переменные во время объявления.
например.
List<String> names = new ArrayList<String>();
Map<String,String> pairs = new HashMap<String,String>();