Mam nadzieję, że poniższy artykuł przypadnie Ci do gustu. Nie przywiązuj zbyt dużej wagi do daty powstania tego wpisu. Nawet jeśli napisałem go na początku istnienia bloga, to staram się przynajmniej raz w roku przeglądać stare treści i je aktualizować. Jeżeli mimo wszystko zauważysz jakąś nieścisłość w tekście, to daj mi proszę znać w komentarzu poniżej.
Pamiętaj także, że wartość tego bloga podbijają pozostawione tu komentarze. Jeżeli temat poruszany we wpisie Cię interesuje, to polecam doczytać także komentarze do niego. Znajdziesz w nich chociażby punkt widzenia innych osób, czy dodatkowe informacje, o których ja zapomniałem lub nie wiedziałem.
Dzisiejszym wpisem chciałbym rozpocząć serię artykułów z kategorii Przybornik Javowca, w ramach którego będę publikował informacje o ciekawych bibliotekach, frameworkach oraz narzędziach ułatwiających życie programisty Java. W środowisku Java istnieje ogromna rzesza ciekawych projektów, często kontrybuowanych wyłącznie hobbystycznie, które potrafią diametralnie uprościć i przyspieszyć naszą pracę. Niestety nierzadko jest tak, że zanim wpadniemy na właściwy, to próbujemy odkryć koło na nowo i zaczynamy programować wszystko od zera. Artykuły z tego cyklu mają uchronić Cię przed takimi sytuacjami i przybliżyć najpopularniejsze rozwiązania często implementowanych problemów.
Boilerplate – co to takiego?
Próbowałem, ale nie znalazłem w języku polskim dobrego odpowiednika słowa „boilerplate”, więc postanowiłem pozostać przy angielskim oryginale i wyjaśnić w kilku słowach o co chodzi. Termin boilerplate code odnosi się do tych części kodu źródłowego, które muszą zostać wprowadzone, żeby w ogóle mieć możliwość rozpoczęcia pracy nad właściwym zadaniem. Można chyba powiedzieć, że to taki „szablonowy” kod.
Java należy do tej grupy starożytnych języków, w których boilerplate spotykamy w wielu miejscach. Dobrym przykładem jest choćby wypisanie ciągu znaków na ekranie. W Javie wygląda to tak:
Program napisany w języku Java wypisujący "Hello World!" na ekranie.
Java
1
2
3
4
5
publicclassHelloWorld{
publicstaticvoidmain(String[]args){
System.out.println("Hello World!");
}
}
a dla kontrastu w Pythonie wystarczy:
Program napisany w języku Python wypisujący "Hello World!" na ekranie.
Python
1
print"Hello World!"
Jest to tylko prosty przykład, ale chyba wystarczająco oddaje ideę terminu „boilerplate”.
Czym jest i co potrafi Lombok?
Project Lombok jest biblioteką języka Java, mającą ukoić część bolączek związanych z boilerplatem. Działa ona w ten sposób, że w trakcie kompilacji, na podstawie określonych adnotacji generuje odpowiedni kod źródłowy.
Spójrzmy na przykładowy feature (przykład zaczerpnięty z dokumentacji) – generowanie getterów/setterów. Kod źródłowy w czystej Javie wyglądający następująco:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
publicclassGetterSetterExample{
/**
* Age of the person. Water is wet.
*/
privateintage=10;
/**
* Name of the person.
*/
privateStringname;
@Override
publicStringtoString(){
returnString.format("%s (age: %d)",name,age);
}
/**
* Age of the person. Water is wet.
*
* @return The current value of this person's age. Circles are round.
*/
publicintgetAge(){
returnage;
}
/**
* Age of the person. Water is wet.
*
* @param age New value for this person's age. Sky is blue.
* @param age New value for this person's age. Sky is blue.
* @return The current value of this person's age. Circles are round.
*/
@Getter@Setterprivateintage=10;
/**
* Name of the person.
* -- SETTER --
* Changes the name of this person.
*
* @param name The new value.
*/
@Setter(AccessLevel.PROTECTED)privateStringname;
@OverridepublicStringtoString(){
returnString.format("%s (age: %d)",name,age);
}
}
Gdy mamy więcej pól w klasie, to kod którym zarządzamy przy pomocy Lomboka jest naprawdę zwięzły. Szczególnie, że adnotacje @Getter i @Setter możemy używać również na całej klasie, a nie tylko na poszczególnych polach.
Fajnym przykładem jest też użycie adnotacji @Builder. Żeby uzyskać coś takiego w Javie (znów przykład zaczerpnięty z dokumentacji):
// complicated switch statement to produce a compact properly sized immutable set omitted.
// go to https://projectlombok.org/features/Singular-snippet.html to see it.
Set<String>occupations=...;
returnnewBuilderExample(name,age,occupations);
}
@Override
publicStringtoString(){
return"BuilderExample.BuilderExampleBuilder(name = "+this.name+", age = "+this.age+", occupations = "+this.occupations+")";
}
}
}
wystarczy napisać:
Java
1
2
3
4
5
6
7
8
9
10
importlombok.Builder;
importlombok.Singular;
importjava.util.Set;
@Builder
publicclassBuilderExample{
privateStringname;
privateintage;
@SingularprivateSet<String>occupations;
}
Wygląda zachęcająco? 🙂
Jeszcze więcej możliwości
Przykłady, które pokazałem to tylko ułamek możliwości Lomboka. W celu zapoznania się z pełną listą możliwości odsyłam do strony projektu. Zachęcam równie do obejrzenia poniższego demo:
Wsparcie w IDE
Ktoś może się teraz zastanowić jak z Lombokiem żyć w praktyce – skąd moje IDE ma wiedzieć, że adnotacja @Getter na polu String firstName daje nam metodę String getFirstName()? To się w ogóle skompiluje? Owszem tak 🙂 Do szczęścia trzeba naprawdę niewiele. Wystarczy zainstalować odpowiednią wtyczkę do swojego ulubionego IDE i wszystko będzie śmigać. Sam używam takiej w IntelliJ IDEA i nie zaobserwowałem żadnych problemów. Lombok jest już całkiem dojrzałym projektem, więc myślę, że analogiczne pluginy do Eclipse’a, czy NetBeansa również nie powinny sprawiać kłopotów.
Cykl artykułów "Przybornik Javowca"
Ten wpis jest częścią cyklu, w ramach którego opisuję moje doświadczenia i spostrzeżenia na temat różnego rodzaju sprawdzonych bibliotek, frameworków i innych narzędzi, które pomagają programiście Java w codziennej niedoli
Artykuły z tej serii łączą się wyłącznie tematyką i nie są ze sobą mocno związane, a więc spokojnie możesz je czytać wybiórczo. Wszystkie opublikowane do tej pory wpisu znajdziesz poniżej:
Przyznam szczerzę, że do Lomboka przekonałem się dopiero za drugim podejściem. W pierwszej pracy był on projektem wyklętym 😉 W obecnym zespole używamy go na co dzień i teraz stwierdzam, że naprawdę potrafi ułatwić życie. Jeśli biblioteka nie przekonuje Cię na pierwszy rzut oka, to nie przekreślaj jej od razu. Daj jej przez jakiś czas szansę na placu boju. Może okaże się, że jest Twoim najlepszym kompanem na polu bitwy.
Potencjalne problemy
Nie będę ukrywał, że Lombok nie jest wolny od wad. Na szczęście do tej pory zauważyłem tylko jedną większą. Mianowicie czasami gryzie się on z innymi bibliotekami generującymi kod (np. z Querydsl). Nie ma się jednak tego co, aż tak bardzo obawiać. Nie jest tak bowiem, że nie da się używać Lomboka i Querydsl jednocześnie. Czasami po prostu zdarza się (gdy używamy elementów jednego tam gdzie działa drugi), że jeden drugiemu wchodzi w drogę i całość się nie kompiluje. Obejściem problemu jest po prostu rezygnacja z feature’u Lomboka w danym miejscu i wszystko śmiga. Nie znalazłem jeszcze innego sensownego rozwiązania tego problemu. Jeśli Ty masz już jakieś sprawdzone, to chętnie się o nim dowiem 🙂 Napisz o nim w komentarzu.
Wołanie o pomoc
Jeżeli spodobał Ci się dzisiejszy artykuł i chciałbyś opublikować podobny na temat swojej ulubionej biblioteki, nietypowego frameworku, czy innego pożytecznego narzędzia, to gorąco zachęcam do kontaktu ze mną (poprzez komentarz poniżej, mailowo pod adresem piotr@programistanaswoim.pl lub przez dowolny portal społecznościowy). Bardzo chętnie nawiążę stałą lub doraźną współpracę na tej płaszczyźnie. Powody są dwa. Po pierwsze ciekawych narzędzi jest tyle, że sam nie dam rady ich przedstawić. Po drugie zamierzam publikować informacje o narzędziach, które zostały sprawdzone w bojach i faktycznie dobrze działają w praktyce, a takich miałem okazję przetestować ograniczoną ilość. Perspektywa innej osoby na pewno byłaby bardzo pomocna.
Zapraszam do komentowania i wyrażania swojej opinii na temat Lomboka. Może masz gorsze doświadczenia z tą biblioteką? A może znasz jego lepszy zamiennik? Z przyjemnością przeczytam o tym poniżej.
Bądź na bieżąco!
Podobają Ci się treści publikowane na moim blogu? Nie chcesz niczego pominąć? Zachęcam Cię do subskrybowania kanału RSS, polubienia fanpage na Facebooku, zapisania się na listę mailingową:
lub śledzenia mnie na Twitterze. Generalnie polecam wykonanie wszystkich tych czynności, bo często zdarza się tak, że daną treść wrzucam tylko w jedno miejsce. Zawsze możesz zrobić to na próbę, a jeśli Ci się nie spodoba – zrezygnować
Dołącz do grup na Facebooku
Chcesz więcej? W takim razie zapraszam Cię do dołączenia do powiązanych grup na Facebooku, gdzie znajdziesz dodatkowe informacje na poruszane tutaj tematy, możesz podzielić się własnymi doświadczeniami i przemyśleniami, a przede wszystkim poznasz ludzi interesujących się tą samą tematyką co Ty.
W grupie Programista Na Swoim znajdziesz wiele doświadczonych osób chętnych do porozmawiania na tematy krążące wokół samozatrudnienia i prowadzenia programistycznej działalności gospodarczej. Vademecum Juniora przeznaczone jest zaś do wymiany wiedzy i doświadczeń na temat życia, kariery i problemów (niekoniecznie młodego) programisty.
Wesprzyj mnie
Jeżeli znalezione tutaj treści sprawiły, że masz ochotę wesprzeć moją działalność online, to zobacz na ile różnych sposobów możesz to zrobić. Niezależnie od tego co wybierzesz, będę Ci za to ogromnie wdzięczny.
Na wsparciu możesz także samemu zyskać. Wystarczy, że rzucisz okiem na listę różnych narzędzi, które używam i polecam. Decydując się na skorzystanie z któregokolwiek linku referencyjnego otrzymasz bonus również dla siebie.
Zawodowy programista od 2009 roku. Samozatrudniony od listopada 2015. Wcześniejszy czas spędził na etacie. Od kilku lat zainteresowany tematyką budżetu domowego, finansów osobistych i optymalizacji finansowej. Prywatnie mąż, tata Tymonka, a także fan Manchesteru United, Uniwersum Wiedźmina, Star Wars oraz LEGO.
Dobry poradnik do rozpoczęcia swojej przygody z java,mozna nauczyć się pisać kod od zera ale po więcej informacji na temat javy to można przeczytać książki lub porobic różne kursy np na eduweb.pl które pomogą ci poznać wiele innych zagadnień które trzeba wiedzieć żeby nauczyć się pisać dobry zoptymalizowany kod.
Cześć Nathan. Dzięki za komentarz. Z nauką programowania jest tak, że jeśli chcesz być dobrym programistą, to musisz robić dwie rzeczy: 1. praktykować (tworzyć projekty, pisać kod, przerabiać praktyczne kursy, kodować przykłady znalezione w książkach) – bez tego nie da się dojść do wprawy i biegłości 2. teoretyzować (m.in. poprzez czytanie książek, czy blogów 😉 ) – programowanie bez solidnych podstaw teoretycznych i wiedzy co siedzi w danym języku, czy narzędziu powoduje, że zaczynamy programować proste rzeczy okrężną drogą, bo nie wiemy, że istnieje jakaś łatwiejsza. Bez teorii często też programujemy „na czuja” – coś się uda zaprogramować i akurat wynik wyszedł dobry, a potem okazuje się, że był to tylko szczęśliwy zbieg okoliczności i faktycznie język działa całkiem inaczej. Dlatego też twierdzę, że w naszym przypadku trzeba jak najlepiej balansować wiedzę teoretyczną i praktyczną. Pozdrawiam!
Jak ostatnio próbowałem lomboka to val bardzo mi przypadł do gustu tylko że wtedy (6 mies temu) nie chciał jeszcze poprawnie działać z lambdami (tj. w lambdach). Sama bibilioteka naprawdę fajna aż dziw bierze że tego w Javie jeszcze nie ma 🙂
Przyznam szczerze, że val ( dla zainteresowanych: https://projectlombok.org/features/val.html ) odkryłem dopiero podczas pisania tego artykułu. Wcześniej korzystałem z prawie wszystkich adnotacji, ale val-a nie używałem.
Z tego co widzę od jakiegoś czasu w dokumentacji jest „WARNING: This feature does not currently work in NetBeans. We’re working on fixing that.” Być może akurat z val jest więcej różnych problemów niż z adnotacjami.
Daj znać jeśli będziesz miał okazję to kiedyś przetestować i sprawdzić czy już działa 😉
Chcesz więcej? W takim razie zachęcam Cię do dołączenia do powiązanych grup na Facebooku (Programista Na Swoim, Vademecum Juniora), gdzie znajdziesz dodatkowe informacje na poruszane tutaj tematy, możesz podzielić się własnymi doświadczeniami i przemyśleniami, a przede wszystkim poznasz ludzi interesujących się tym samym co Ty.
Jeśli jesteś tu po raz pierwszy lub jeszcze tego nie zrobił[a|e]ś to zostaw proszę komentarz pod moim powitalnym wpisem. Będzie mi niezmiernie miło się z Tobą przywitać
Dobroczynność
Moje narzędzia
Jeżeli chciał(a)byś dowiedzieć się z jakich narzędzi korzystam na co dzień, to zapraszam Cię do odwiedzenia strony Narzędzia.
Znajdziesz tam zarówno informacje na temat tego dlaczego czegoś używam, jak i linki referencyjne, dzięki którym zakładając konto w danym serwisie otrzymasz bonus startowy.
18 listopada 2016 at 13:11
Dobry poradnik do rozpoczęcia swojej przygody z java,mozna nauczyć się pisać kod od zera ale po więcej informacji na temat javy to można przeczytać książki lub porobic różne kursy np na eduweb.pl które pomogą ci poznać wiele innych zagadnień które trzeba wiedzieć żeby nauczyć się pisać dobry zoptymalizowany kod.
20 listopada 2016 at 06:58
Cześć Nathan. Dzięki za komentarz. Z nauką programowania jest tak, że jeśli chcesz być dobrym programistą, to musisz robić dwie rzeczy:
1. praktykować (tworzyć projekty, pisać kod, przerabiać praktyczne kursy, kodować przykłady znalezione w książkach) – bez tego nie da się dojść do wprawy i biegłości
2. teoretyzować (m.in. poprzez czytanie książek, czy blogów 😉 ) – programowanie bez solidnych podstaw teoretycznych i wiedzy co siedzi w danym języku, czy narzędziu powoduje, że zaczynamy programować proste rzeczy okrężną drogą, bo nie wiemy, że istnieje jakaś łatwiejsza. Bez teorii często też programujemy „na czuja” – coś się uda zaprogramować i akurat wynik wyszedł dobry, a potem okazuje się, że był to tylko szczęśliwy zbieg okoliczności i faktycznie język działa całkiem inaczej.
Dlatego też twierdzę, że w naszym przypadku trzeba jak najlepiej balansować wiedzę teoretyczną i praktyczną. Pozdrawiam!
12 listopada 2016 at 22:04
Jak ostatnio próbowałem lomboka to val bardzo mi przypadł do gustu tylko że wtedy (6 mies temu) nie chciał jeszcze poprawnie działać z lambdami (tj. w lambdach). Sama bibilioteka naprawdę fajna aż dziw bierze że tego w Javie jeszcze nie ma 🙂
14 listopada 2016 at 13:10
Hej Marcin.
Dzięki za komentarz.
Przyznam szczerze, że val ( dla zainteresowanych: https://projectlombok.org/features/val.html ) odkryłem dopiero podczas pisania tego artykułu. Wcześniej korzystałem z prawie wszystkich adnotacji, ale val-a nie używałem.
Z tego co widzę od jakiegoś czasu w dokumentacji jest „WARNING: This feature does not currently work in NetBeans. We’re working on fixing that.” Być może akurat z val jest więcej różnych problemów niż z adnotacjami.
Daj znać jeśli będziesz miał okazję to kiedyś przetestować i sprawdzić czy już działa 😉
12 listopada 2016 at 13:11
Hmm, wygląda fajnie. Może spróbuję;)
14 listopada 2016 at 12:25
Stanisław, nawet nie zdajesz sobie sprawy, jak Twój komentarz zmotywował mnie i utwierdził w przekonaniu, że artykuły z tej kategorii mają sens 🙂