Предполагая, что структура класса действительно не под нашим контролем, как кажется, имеет место, я думаю, что уловка NPE, предложенная в вопросе, действительно разумное решение, если только производительность не является серьезной проблемой. Одним из небольших улучшений может быть обход логики throw / catch, чтобы избежать беспорядка:
static <T> T get(Supplier<T> supplier, T defaultValue) {
try {
return supplier.get();
} catch (NullPointerException e) {
return defaultValue;
}
}
Теперь вы можете просто сделать:
return get(() -> wsObject.getFoo().getBar().getBaz().getInt(), -1);