2012-07-01 3 views
1

Я работаю над проектом, который был разработан другими разработчиками. В этом проекте любой метод, который возвращает объект или объект, предназначен для возврата специального значения, называемого EMPTY_VALUE.Возвращает пустую структуру данных (сущность) вместо нуля, хорошо ли это?

public Customer getCustomer() { 
    if (everythingFine) { 
     return realCustomer(); 
    } else { 
     Customer.EMPTY_VALUE; 
    } 
} 

А класс Customer:

public class Customer { 
    public static final Customer EMPTY_VALUE = new Customer(); 

    private String firstName; 
    private STring lastName; 

    public Customer() { 
     this.firstName = ""; 
     this.lastName = ""; 
    } 
} 

В других местах, которые используют метод GetCustomer():

Customer customer = getCustomer(); 
if (customer != Customer.EMPTY_VALUE) { 
    doSomething(customer); 
} 

ли выше способ имеет какие-либо преимущества по сравнению с null -Проверки? Покупает ли он что-нибудь?

Customer customer = getCustomer(); 
if (customer != null) { 
    doSomething(customer); 
} 

ответ

4

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

5

Я бы сказал не. Не возвращайте null или возвращайте специальный «объект ошибки» из метода. Пусть вместо этого они генерируют исключение. Таким образом, вам не нужно «проверять» каждый раз, когда вы это называете.

public Customer getCustomer() { 

    if (everythingFine) { 
     return realCustomer(); 

    throw new NoCustomerException(); 
} 

И код, используя метод был бы намного проще:

doSomething(getCustomer()); 

Это может быть (как в примере выше) исключение во время выполнения или проверяемого исключения.


Если вы должны выбирать между этими двумя я бы выбрал непустой вариант, так же, как я выбрал бы вернуть пустой список из метода вместо null. Однако я бы призвал вас не писать какой-либо специальный код для обработки этого специального объекта, его следует обрабатывать, как и любой другой клиент.

4

Мне не нравится идея создания пустого объекта Customer. Что такое семантика? Это настоящий клиент или нет?

Я бы предпочел использовать что-то вроде Optional из Guava в этой ситуации или просто использовать null в зависимости от кода клиента. Прочтите описание в ссылке, чтобы увидеть общие применения и API для опций.

+0

спасибо за ссылку 'Факультативный'. Это отличная идея. – Genzer

Смежные вопросы