Angenommen, ich möchte etwas zugreifen wievermeiden endlose null/leer Kontrollen unter Verwendung von Try-Catch
productList.get(0).getCustomerList().get(0).getAddressList().get(0).getRegion.getCode()
Und auf jeder Stufe I für null oder leere Liste überprüfen müssen. Die Datenstruktur ist wirklich kompliziert, und Refactoring könnte eine Option sein, könnte aber auch zu kompliziert oder unmöglich sein.
Der resultierende Code wäre:
if(productList != null
&& !productList.isEmpty()
&& productList.get(0).getCustomerList().get(0) != null
&& ...){
return productList.get(0).getCustomerList().get(0).getAddressList(0).getRegion.getCode();
}
Der resultierende Code hässlich ist, ausführlich, trägt keine wirkliche Business-Logik und ist schwer zu lesen. Gibt es eine kluge Möglichkeit, das zu vermeiden? Wäre es akzeptabel, zu tun:
try{
return productList.get(0).getCustomerList().get(0).getAddressList(0).getRegion.getCode();
} catch(NullPointerException | IndexOutOfBoundException e){
return null;
}
https://en.wikipedia.org/wiki/Law_of_Demeter ... – Tom
ein Teaser: 'für {Produkt <- productList.headOption; Kunde <- product.getCustomerList.headOption; Adresse <- customer.getAddressList.headOption} yield {address.getRegion.getCode} 'Dies ergibt eine' Option [Int] ', die den Code enthält oder' None', wenn irgendwo im Pfad ein Element fehlt. Beseitigt das Risiko von 'NullPointerException'. Scala und Functional Programming sind deine Freunde. – maasg
Randnotiz: Listen und andere Aufzählungen sollten eigentlich nie null sein. Leer, ja, null, nein. –