Каковы хорошие легковесные шаблоны проектирования для избежания нулей в Java? - PullRequest
11 голосов
/ 06 февраля 2012

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

Ответы [ 9 ]

11 голосов
/ 06 февраля 2012

Нулевой объектный образец . Посмотрите на Необязательный класс из библиотеки google-guava .

В их вики есть статья об использовании и избежании нулей.

4 голосов
/ 06 февраля 2012

Лучший шаблон дизайна из всех - Check Not-Null Idiom

if(obj != null) {
    ...
}
3 голосов
/ 01 февраля 2013

Существует несколько полезных аннотаций, разработанных IntellyJ для этих целей: @ Nullable и @ NotNull
Обнаружение вероятных NPE

3 голосов
/ 06 февраля 2012

Почему вы хотите избежать исключения нулевого указателя? Получение null при ожидании чего-то другого является одним из первых признаков того, что что-то не так, когда вы пишете код. Такие вещи, как Null Object Pattern, следует использовать, когда вы уверены, что этого достаточно. Одним из самых больших недостатков шаблона проектирования является их злоупотребление \ неправильное использование.

EDIT:

Я думаю, что лучший способ уменьшить нулевой возврат - это увеличить использование исключений. Подумайте о List, возвращающем нулевой объект, когда вы пытаетесь получить доступ к элементу с индексом -1, вы будете использовать такие вещи, как

if( list.get(-1).equals(nullObject))

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

3 голосов
/ 06 февраля 2012

Просто привыкните не возвращать нулевые объекты в ваших методах.

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 .

2 голосов
/ 01 февраля 2013
"something definetly not null".equals(maybeNullVar)

против

maybeNullVar.equals("something definetly not null")
2 голосов
/ 06 февраля 2012

Полагаю, это дело вкуса, но я бы сказал, что самые большие запреты языков, таких как Smalltalk / Objective-C, в том, что у них нет нулевого значения и что нет никаких исключений NullPointerException.Я не фанат «шаблона нулевого объекта», на самом деле я страстно его ненавижу, так как считаю, что устранение неполадок и поиск ошибок намного сложнее без какой-либо реальной выгоды.Null имеет значение (часто плохое) и не должно рассматриваться как любое другое общее состояние.

Как было упомянуто в этой теме, NPE действительно мощны и являются хорошим способом для выявления синтаксических ошибок или плохого кодирования.рано и if (obj != null) довольно просто.Если ваше приложение начинает генерировать NPE во время выполнения, вы сделали что-то не так и вам нужно это исправить.Не пытайтесь скрыть исключение, исправьте все, что ВЫЗЫВАЕТ исключение.

1 голос
/ 28 сентября 2016

Вам не нужно использовать какой-либо шаблон проектирования.

Просто инициализируйте переменные во время объявления.

например,

List<String> names = new ArrayList<String>();
Map<String,String> pairs = new HashMap<String,String>();
1 голос
/ 15 июня 2015

Эти методы (см. Также 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...