Okej, wszystko co napisałeś jest fajne i zgodne ze sztuką. Ale w praktyce siadasz do projektu w pracy i np masz model z 15 polami, więc już samych getterów/setterów jest 30. A te pola to nie zwykłe prymitywy, tylko kolejne obiekty modelowe. Dołożenie tylu kombinacji spowodowałoby 70-100 metod getterowych w klasie modelu :( I cóż wtedy zaradzić?
To co opisałeś to nie obiekty tylko struktury danych (czyli wszystkie/większość pól dostępna na zewnątrz).
Osobiście nie mam nic przeciwko programowaniu strukturalnemu, ale trzeba mieć świadomość że się je uprawia.
I wtedy można zrobić coś takiego:
Kopiuj
public class MyTest {
public ClassC getC() {
ClassA objA = getA();
return getC(objA);
}
private ClassA getA() {
return new ClassA(); // zrodlo dowolne
}
private ClassC getC(ClassA obj) {
return obj != null ? obj.getB() != null ? obj.getB().getC() : null : null; // wyrazenie dowolnie
}
}
// i na koncu
object.getC();
I teraz najważniejsze: ten kod powyżej jest rozwlekły i wydaje się nadmiarowy - i taki ma być.
Bo masz takie ścieżki wyboru:
a) albo Twój (kolejkowy) kod dowolnie permutuje sobie wywołania struktur danych w programie i nie panujesz nad tym (faktura wyciąga sobie dane o płci ze struktury HR-owej z CV-ki)
b) albo wiesz co robisz i jesteś pewien że możesz zrobić właśnie tak getC() i będzie to rozwiązanie stabilne.
c) albo robisz CQRS / fasadę które na potrzeby zebrania potrzebnych danych odpalają odpowiednie zapytanie które mieli po bazie
Rozwiązanie (a) wydaje się najwygodniejsze, ale oznacza brak architektury przepływu danych.
Rozwiązanie (b) ukrywa ale i usztywnia dostęp do danych. Zwiększa pracochłonność rozwiązania. Stosowane głównie w starszych architekturach.
Rozwiązanie (c) jest płynne - gdy zmienia się źródło danych zmieniasz zapytanie i po sprawie. Zapytanie łatwo przekierujesz na inną tabelę czy powiązanie. Jeśli wynik (Proxy, Mapa, DTO itp) się nie zmienia to klienci klasy nie muszą być przebudowywani.
A Optionala na razie nie używam - w pracy Java 7. Pewnie do jakichś prostych wywołań, jednostopniowych bym użył. Ale nie do takiej kolejki.