Часто в java мне нужно получить значение свойства объекта, который находится глубоко в этом объекте. Например, если я уверен, что все мои суб-объекты не нулевой, я могу сделать это:Лучшая практика: получить глубокое значение объекта
public function getDeepValue(A a) {
String value = a.getB().getC().getListeD().get(0).getE().getValue();
return value;
}
Но в случае суб объектов родителя может быть пустым, я должен проверить каждый объект.
Чтобы сделать это, я вижу 2/3 решения:
Первый шаг за шагом:
public function getDeepValue(A a) {
if(a == null){
return null;
}
B b = a.getB();
if(b == null) {
return null;
}
C c = b.getC();
if(c == null){
return null;
}
List<D> ds = c.getListeD();
if(ds == null || ds.size() == 0){
return null;
}
D d = ds.get(0);
if(d == null) {
return null;
}
E e = d.getE()
if(e == null){
return null;
}
return e.getValue();
}
Во-вторых, тест все в одном, если блок, тааак загрязнен:
public function getDeepValue(A a) {
if(a != null && a.getB() != null && a.getB().getC() != null && a.getB().getC().getListeD() != null && a.getB().getC().getListeD().size() > 0 && a.getB().getC().getListeD().get(0) != null && a.getB().getC().getListeD().get(0).getE() != null){
return a.getB().getC().getListeD().get(0).getE().getValue();
}
return null;
}
Третий раствор, используя блок захвата try:
public function getDeepValue(A a) {
try {
return a.getB().getC().getListeD().get(0).getE().getValue();
} catch(NullPointerException e) {
return null;
} catch(IndexOutOfBoundsException e) {
return null;
}
}
Решение 1 кажется n ot слишком плохо, но требует много кода. Это, как правило, решение, которое я использую.
Решение 2 для меня действительно грязное ...
В документе я действительно как решение 3, но это хорошее решение с точки зрения выступлений?
Есть ли другие приемлемые решения?
Спасибо за помощь, я надеюсь, что мой английский не так уж плохо ..
Привет
Релевантно читать: «закон деметры» (например, этот: http://www.ccs.neu.edu/research/demeter/demeter-method/LawOfDemeter/paper-boy/demeter.pdf) – reto
Лучшая практика было бы рефакторированием, поэтому вам не нужно проходить через большую цепочку возможных значений null. Из трех представленных решений мне нравится, по крайней мере, третий. Вы заметите, что он также ловит исключения, которые могут быть получены из методов get и преобразуют их в нулевое возвращаемое значение. –