Strona główna > Java > Jeszcze o Lombok

Jeszcze o Lombok

Miała to być bardziej wyczerpujące rozpoznanie tego co może oferować Lombok. Zaczęło się to od szukaniem sposobów na ulepszenie pisania kodu. Ale chęci, czy raczej czas się wyczerpał🙂, więc ograniczę się do hasłowego opisania tego co się udało zrobić.

Lombok jako taki
Idea całego projektu to zwiększenie czytelności kodu, poprzez eliminowanie tych jego elementów, które są i tak zwykle generowane. Przykład to gettery i settery. I samo to jest świetne, założenia są spełnione; jednak ciekawe jest to jak to jest realizowane. Nie jest to uruchomienie kodu w jakiś specjalnych warunkach, gdzie nasza klasa służy do wyprodukowania Proxy, które będzie miało wszytko co potrzebne. Jest to manipulacja kodem na etapie kompilacji. W skrócie mówiąc: brakujący kod zostanie automatycznie uzupełniony przed właściwą kompilacją. Stoi za z tym AST, a trochę światła może rzucić to lub to.

Do czego można to użyć
Dostarczony zbiór generowanych elementów nie jest duży, ale twórcy zachęcają do tworzenia własnych rozszerzeń. Właśnie chciałem napisać taki coś, ale na razie się poddałem. Chodziło mi o zrealizowanie idei, która jest w Groovy. Aby można było skrócić pisania ochronnych if_ów jak w tym przypadku:

if (raport.getUser() != null && raport.getUser().getAddress() != null) {
  String streetName = raport.getUser().getAddress().getStreetName();

co przy Groovy mogło wyglądać tak:

if (raport.getUser()?.getAddress() != null) {
  String streetName = raport.getUser().getAddress().getStreetName();

Używając techniki z Lombok wyobrażałem sobie że w javie wyglądałby to tak:

if (@NPE2Null raport.getUser().getAddress() != null) {
  String streetName = raport.getUser().getAddress().getStreetName();

Po próbie wdrożenia tego okazało się że adnotacja w tym miejscu się nie sprawdzi, więc kod uległ zmianie do czegoś takiego:

@NPE2Null Address address = raport.getUser().getAddress();
if (address != null) {
  String streetName = address.getStreetName();

A to z kolei sprowadzałoby się do tego że zostałby wygenerowany kod odpowiadający mniej więcej czemuś takiemu:

Address address = (raport.getUser() != null) ? raport.getUser().getAddress() : null;
if (address != null) {
  String streetName = address.getStreetName();

Trochę może sztuka dla sztuki😉, ale jak ma się 5 poziomów zagłębienia zamiast 2 to zagmatwanie jest już duże (z drugiej strony ktoś mógłby się skarżyć że nie należy doprowadzać do takich sytuacji).

Dlaczego nie udało mi się tego dokończyć
Jak już na wstępie pisałem głównie z braku czasu (samozaparcia) nie zostało to zrealizowane. Co nie znaczy że nie można.
Zabrałem się do tego przez tworzenie rozszerzenie na bazie samego projektu, zrobiłem kopie istniejącego już przypadku (@Cleanup). Dzięki temu w miarę wszedłem w proces prac nad tym. Nie jest on wygodny (przynajmniej nie udało mi się go takim uczynić), weryfikacja tylko przez testy. Nie mogłem włączyć trybu debug, aby podejrzeć jak kod jest modyfikowany „na żywo” przed kompilacją. Inną trudnością jest sama idea modyfikacji kodu, tu trzeba trochę posiedzieć aby zrozumieć jak to działa (skopiowanie istniejącego przypadku nie jest wystarczające).

Na koniec
Za takim podejściem, do ułatwienia sobie życia poprzez nie pisanie zbytecznego kodu, kryć się mogą całkiem nowe możliowści. Jakby znalazło to większy audytorium, oraz samo pisanie rozszerzeń byłoby prostsze (zamkniecie w jakiejś dodatkowej abstrakcie manipulacje kodem), to moglibyśmy mieć wysyp nowych adnotacji do dowolnej dziedziny. Coś jak tagi w jsp😉 lub nowy sposób tworzenia DSLi.

Kategorie:Java Tags: ,
  1. Brak komentarzy.
  1. No trackbacks yet.

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s

%d bloggers like this: