Обрабатывать NullObjects - PullRequest
1 голос
/ 16 декабря 2010

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

String x = object.getString1!=null?object.getString1:""; 

Однако я не очень доволен этим, так как это все еще означает постоянную проверку на ноль. Еще одна вещь, о которой я читал, - это не наличие методов-получателей, возвращающих нуль, а возвращение экземпляра «нулевого объекта». Однако я не вижу, как я мог заставить это работать для Integers / BigDecimal / etc ..., так как они по умолчанию содержат значение.

Я не на 100% заинтересован в идее реализации NullObjects. Кто-нибудь еще получил лучшее представление о том, как обращаться с нулевыми?

Ответы [ 2 ]

1 голос
/ 16 декабря 2010

Если ваш подход работает хорошо для вас, почему бы не преобразовать его в статический метод и использовать постоянно?

Google Guava сделал нечто подобное для строк. Если вы посмотрите под капот класса Strings , вы увидите метод nullToEmpty, который реализован следующим образом:

public static String nullToEmpty(@Nullable String string) {
    return (string == null) ? "" : string;
 }

Не беспокойтесь аннотацией @Nullable.

Но из вашего кода, я подозреваю, есть большие проблемы, скрывающиеся вокруг. Нулевые целые числа и BigDecimal являются признаком того, что что-то где-то не так, и вы можете проверить соответствующие части. Если для этих объектов установить нулевое значение, это может быть индикатором того, что вы должны генерировать исключение, но это, конечно, ваше решение.

0 голосов
/ 16 декабря 2010

Если вы используете C #, вы можете использовать operator ??:

String x = object.getString1 ?? "";

, который, ИМХО, более читабелен.

Что касается вашего вопроса, я не вижугде смысл использовать шаблон Null Object для типа значения, как вы уже отметили, что они не могут содержать нулевое значение, если они не объявлены как Nullable, поэтому у вас всегда будет значение valid (допустимо в языковой областино, возможно, не действует в домене приложения).Итак, это совсем другой вопрос.

То, что вы должны сделать с нулевым указателем, действительно зависит от контекста, может быть, подходит нулевой объект, но если это невыполнимо, вы должны выбросить исключение или, возможно, использоватьнекоторые по умолчанию ...

...