2015-02-27 3 views
3

Я хочу получить поле из API, который присутствует внутри классов. Да, я знаю, что это против Закона Деметры, но у меня нет выбора.Как избежать проверки Nested null

Пример

getClassA().getClassB().getClassC().getClassD().getAccountId(); 

Так добавить нулевой чек как его плохой код запах, так что я пришел с ниже код:

try{ 
getClassA().getClassB().getClassC().getClassD().getAccountId(); 
}catch(NullPointerException ex){ 
S.O.P("Null Found"); 
} 

или

ClassA a = getClassA(); 
if(a!=null){ 
ClassB b = a.getClassB(); 
So on..... 
} 

мой вопрос, который лучше подходить к вышеупомянутому или явно извлекать каждый класс и проверять значение null и перейти на следующий уровень Это противоречит закону Деметера

+2

Посмотрите здесь: http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html Это точно объяснил проблему – NwDev

+0

Я хотел бы сказать, что ваша архитектура/дизайн не является правильным если у вас есть такая проблема. Как вы сами сказали, вы нарушаете Закон Деметры, который может решить эту проблему. Не могли бы вы предоставить более широкий контекст того, что вы пытаетесь сделать? –

+0

@NwDx Необязательно здесь не поможет, это будет набор вложенных вызовов isPresent() '. –

ответ

2

Дизайн шаблона Null Object - это способ, которым поглощается Java 8 через необязательный класс, что означает, что у вас есть обертка, в которой либо у вас есть данные, либо у вас есть пустые данные.

Его что-то вроде

   MyObject 
     RealObject NullObject 

Где вместо передачи нуль, вы передаете NullObject, который обеспечивает тот же интерфейс, как MyObject (который может быть бетон/абстрактный класс/интерфейс)

+0

Спасибо @SMA за ввод данных, я проверил, что перед публикацией здесь но это для Java8 правильно? Но я ищу Java 7 – user2387280

+0

Здесь я использую API, поэтому я не могу сказать им, что он пропускает пустой вложенный объект. – user2387280

+0

Попытайтесь использовать ту же концепцию, что и я, указав шаблон дизайна Null Object. См. Иерархию классов, из которой он следует (я только что дал подсказку выше в своем ответе) – SMA

1

Это нуждается в Java 8, Ты прав. Я думаю, что это будет работать аналогично в Гуаве.

public class OptionalTest { 

    public static void main(String[] args) { 
    A a = new A(); 
    Optional<A> opa = Optional.ofNullable(a); 
    int accid = opa.map(A::getClassB).map(A.B::getClassC).map(A.B.C::getClassD).map(A.B.C.D::getAccountID).orElse(-1); 

    if (accid > -1) { 
     System.out.println("The account id is: " + accid); 
    } else { 
     System.out.println("One of them was null. Please play with commenting."); 
    } 
    } 

    static class A { 
     B b = new B(); 
     //B b = null; 
     B getClassB() { 
     return b; 
     } 

     static class B { 
     //C c = new C(); 
     C c = null; 
     C getClassC() { 
      return c; 
     } 

      static class C { 
      D d = new D(); 
      //D d = null; 
      D getClassD() { 
       return d; 
      } 

       static class D { 
       private final int accountId = 2; 
       int getAccountID() { 
        return accountId; 
       } 
       } 
      } 
     } 
    } 
} 
Смежные вопросы