Какие хорошие легкие шаблоны проектирования для исключения нулей в Java?

Очевидно, что одним из величайших банов программирования Java является nulls и исключение null-указателя. Какие шаблоны дизайна существуют, которые не добавляют слишком много к вашему коду, но уменьшают проблему исключений нулевого указателя песка?

Ответ 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))

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

Ответ 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>();