Было бы полезно иметь метод, возвращающий значения для нулевых объектов? - PullRequest
0 голосов
/ 19 сентября 2008

Было бы полезно иметь возможность предоставить возвращаемое значение метода для нулевых объектов?

Для списка нулевые возвращаемые значения могут быть:

get(int) : null
size() : 0
iterator() : empty iterator

Это позволило бы следующий код с меньшим количеством нулевых проверок.

List items = null;

if(something) {
    items = ...
}

for(int index = 0; index < items.size(); index++) {
    Object obj = items.get(index);
}

Это будет использоваться только в том случае, если класс или интерфейс его определили, и проверка на ноль все еще будет работать. Иногда вы не хотите выполнять нулевые проверки, поэтому кажется, что это может быть полезным, если вы выберете эту опцию.

От: http://jamesjava.blogspot.com/2007/05/method-return-values-for-null-objects.html

Ответы [ 5 ]

3 голосов
/ 19 сентября 2008

Приятно, что не нужно проверять NULL, а некоторые языки делают это проще - например, Типы C #, не являющиеся NULLable, или Haskell, который не имеет NULL, но может выразить отсутствующее значение с помощью конструктора типа Maybe.

NULL отличается от пустого списка. Вы можете принять точку зрения, что кто-то, передающий NULL, где вам нужен список, делает ошибку в программировании, и что правильно сделать, это выбросить исключение NullPointerException.

Типичное оправдание для принятия значений NULL состоит в том, что часто есть случай, когда вам не нужен список, и вам не нужно создавать новый пустой список, особенно когда есть некоторая обеспокоенность по поводу эффективности. Вы можете получить множество преимуществ, не меняя язык, но вместо этого имея статический пустой список, в который могут проходить люди, который не нужно повторно инициализировать.

2 голосов
/ 19 сентября 2008

Это шаблон называется Null Object

http://en.wikipedia.org/wiki/Null_Object_pattern

0 голосов
/ 19 сентября 2008

В C # (среди других языков) это обычно не допускается. Без экземпляра Foo .net не знает, как вызвать метод Foo или дочерний метод Foo.

Однако метод расширения C # 3.0, применяемый к типу Foo, позволил бы это:

Foo x = null;
if (x.Bar() == 0)
{
  Console.WriteLine("I win");
}

Бар можно построить так:

public static int Bar (this Foo theFoo)
{
  return theFoo == null ? 0 : 1;
}
0 голосов
/ 19 сентября 2008

Ruby делает это (как и другие). Он имеет ноль вместо нуля, и это объект.

Я ненавижу, когда функции, которые должны возвращать списки, могут возвращать ноль. Лучше вернуть пустой список и позволить пользователю решить, хотят ли они проверять наличие пустого значения (пусто) или нет.

0 голосов
/ 19 сентября 2008

Это хорошая идея.

Smalltalk делает это.

Существует объект NULL. Он не спускается с объекта. (Smalltalk - это иерархия классов с одинаковыми корнями, подобная Java)

Для продвинутых учеников вы можете подкласс для создания прокси!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...