Techniki Zaawansowane
8 godz. 35 min · Java · Full-stack i Programowanie
Rafał SolarskiW poczatkowych lekcjach przyjrzymy sie pokladowi, na jakim bedziemy uruchamiali nasze programy. Wykorzystamy VisualVM do podgladania parametrów JVM. Zobaczymy równiez jakie zasoby sa tam dostepne oraz dowiesz sie jak monitorowac to, czy dobrze z nich korzystamy. Opowiemy Ci tez miedzy innymi o tym, jak zrobic heap i thread dump, oraz jak wlaczyc logi GC.
Kolejne lekcje kursu zostaly poswiecone wyrazeniom regularnym. Wyrazenia regularne mozemy wykorzystac nie tylko do walidacji danych wprowadzania przez uzytkownika, ale równiez do dzielenia tekstu oraz wyluskiwania wystapien wzorców w duzym tekscie. W tym rozdziale dowiemy sie miedzy innymi tego, jak mozemy wykorzystac ten potencjal z poziomu Javy.
Dzieki typom generycznym jestesmy w stanie osiagnac bezpieczenstwo typów w trakcie kompilacji przy zachowaniu elastycznosci pisanego kodu. W nastepnym rozdziale kursu przyjrzymy sie temu, jak mozemy je wykorzystac, oraz w jaki sposób czasami nalezy z tego bezpieczenstwa zrezygnowac.
Interfejsy funkcyjne to sposób na przeniesienie odrobiny swiata programowania funkcyjnego do Javy. Gdy polaczymy je z wyrazeniami lambda oraz API strumieni pozwola nam pisac te sama logike w duzo bardziej przejrzysty sposób.
Kolekcje, czyli listy, mapy, zbiory i kolejki to jedne z najczesciej wykorzystywanych klas w codziennej pracy. To jak dobrze poznamy ich mozliwosci ma ogromny wplyw na to, w jaki sposób bedziemy podchodzili do rozwiazywania wyzwan na naszej drodze.
System plików to zasób bez którego ciezko sobie poradzic. Pozwalaja nam na dostarczanie konfiguracji, danych wejsciowych i wyjsciowych, a przez to równiez integrowanie ze soba calych systemów.W tym rozdziale nauczymy sie korzystac z tych dobrodziejstw w bezpieczny sposób wykorzystujac m.in. IO Streams.
Trzymanie daty w String to niekoniecznie najwygodniejszy sposób. Juz od pewnego czasu Java dysponuje bardzo wygodnym Date&Time API - zobaczymy, co mozemy w nim znalezc.
Wielowatkowosc nie jest prosta... i dlugo tak jeszcze pozostanie. Nawet jesli korzystamy z frameworków, które próbuja ja przed nami ukryc, to ciagle musimy byc swiadomi problemów jakie sie z nia wiaza. W tym rozdziale poznamy glówne problemy na jakie mozna natrafic programujac wielowatkowo w Javie. Poznamy równiez klasy, które zdecydowanie pomoga nam zapanowac nad ta zlozonoscia.
JDBC to najbardziej podstawowy sposób laczenia sie z baza SQL z poziomu Javy. W wielu systemach/aplikacjach stosuje sie rozwiazania ORM takie jak JPA/Hibernate. Mimo wszystko warto wiedziec jak to pod spodem dziala oraz umiec poradzic sobie w aplikacjach, gdzie wybrano bardziej "lekkie" podejscie niz Hibernate.
Na koniec kursu wykorzystamy zdobyta wiedze, aby stworzyc prosta aplikacje pozwalajaca na przechowywanie danych o wydatkach. Po stworzeniu coreu aplikacji, mozesz spróbowac uzupelnic go za pomoca GUI.
Ten kurs stworzony zostal przede wszystkim z mysla o osobach, które juz poznaly podstawy jezyka, takie jak zmienne, mechanizmy kontroli wykonania, klasy, typy generyczne.Jezeli chcesz poczuc sie swobodnie nie tylko jesli chodzi o mechanizmy jezyka, ale równiez pod wzgledem znajomosci standardowej biblioteki Javy - to kurs w sam raz dla Ciebie. Materialy beda przydatne dla studentów, którzy znaja juz podstawowa skladnie Javy; programistów Javy chcacych poszerzyc lub uporzadkowac swoja wiedze; programistów innych jezyków, którzy chca poznac inny stack technologiczny.
Cześć w tej lekcji zaczniemy trochę tak spokojnie
od obiektu o takiej klasy optional która może
być traktowana jako pewnego rodzaju kolekcja możemy go sobie traktować jako taką
listę która może zawierać od zera do jednego elementu okej zobaczymy
do czego to się może nam przydać wyobraźmy sobie że mam taką sytuację
mamy jakąś metodę która na przykład zwraca wartość
jakąś obiektową tak czy na przykład jakiegoś stringa tak
i on na przykład zwraca wartość jakieś kolumny z bazy danych i tutaj później
coś na tym sobie robimy jakieś uppercase i tak dalej no i teraz ta
kolumna może być na przykład w bazie danych może być pusta
no i teraz pytanie jeżeli ona jest pusta w bazie danych to co zwracamy
pustego stringa nulla rzucamy wyjątkiem możemy
to sobie tak jakoś rozbić na przykład na takie trzy scenariusze pierwszy scenariusz
to jest to że mamy powiedzmy sytuację jak najbardziej prawidłową i jest
to raczej taka standardowa powiedzmy standardowy scenariusz na przykład
mamy tę wartość w bazie danych no to ją zwracamy tak po prostu zwracam tego
stringa mamy drugi scenariusz który też jest prawidłowy
w sytuacji kiedy brak tej wartości jest jak najbardziej okej
no to wtedy co zwracam tutaj zwracamy coś w tym momencie byśmy zwrócili
nulla a trzecia sytuacja to jest sytuacja kiedy mamy jak
najbardziej taką sytuację która jest zła tam nie powinno
być braku na przykład tej wartości tak w tej konkretnej sytuacji jest na przykład
błąd programistyczny tak sobie wyobraźmy w jakim kontekście prawda no
i tutaj mamy powiedzmy tak moglibyśmy to sobie podzielić w ten sposób okej mamy standardowy
scenariusz zwracamy stringa mamy powiedzmy też prawidłowy ale niestandardowy
scenariusz że nie mamy tej wartości między zwracamy nulla a w trzecim przypadku
rzucamy wyjątkiem problem powiedzmy pojawia się w momencie kiedy jesteśmy klientem
tej metody no i teraz no musimy powiedzmy spojrzeć jak jest
zaimplementowana czy jaka jest dokumentacja tej metody żeby dowiedzieć się
czy mamy łapać jakiś wyjątek czy mamy sprawdzać czy tu jest nullem
jest to trochę takie triki i można się bardzo łatwo pomylić lub to
po prostu przeoczyć tak jest jeszcze alternatywne podejście w postaci
tak jakby zamiast przekazywania nulla to to ten alternatywny scenariusz
jak najbardziej dalej prawidłowy sygnalizować czymś innym pusty string
jest powiedzmy kiepski w tym momencie bo nie mówi o tym czy ta kolumna była
pusta czy ta kolumna w tej kolumnie był pusty string tak ciężko
to rozróżnić dlatego można jeszcze zwracać zamiast nulla i zamiast stringa
taką powiedzmy taki wrapper który mówi o tym czy powiedzmy ta
wartość jest pusta czy wartość jest pełna i coś w niej jest
tak i na przykład czy wartość jest pełna i w niej jest jeszcze pusty
string na przykład tak no i właśnie tutaj możemy dodatkowo jeszcze wymusić
na kliencie żeby on zanim dostanie tę wartość to sprawił
czy ona w środku jest tak czy na przykład zastanowił się trochę nad tym czy w
danej w danym jego kontekście ta sytuacja jest prawidłowa no
i tutaj właśnie użyjemy naszego optionala możemy tutaj zrobić optional string
jak widzimy teraz pokrzyżowaliśmy wszelkie plany tutaj wywołania
to uppercase na tym z tego względu że teraz użytkownik
tej metody będzie musiał się zastanowić co zrobić z tym że na przykład
tam jest null tak czy z tym że zawartość jest pusta
tutaj pusty string jeżeli będziemy mieli w kolumnie to też jak najbardziej możemy ograć
po prostu dodając tego stringa i te sytuacje są rozróżnialne tak
nie rzucamy exeption'a też w tym momencie oczywiście gdyby
tutaj sytuacja na przykład doszłaby do czego już co jest bardzo nie halo
w środku tak tej metody to powinniśmy rzucić exception
żeby zaznaczyć że jest błąd programistyczny tak okej teraz
zastanówmy się jak możemy wywołać tego to uppercase bo ciągle poza tym że mamy optionala
na to musimy jakoś żyć z tym prawda więc tutaj wyciągnijmy tę wartość
okej i teraz zanim zrobił tu uppercase powinniśmy sprawdzić
wykorzystując metodę is present czy w środku jest wartość tak zamykamy tu
w jakiegoś if'a i do metody is present mamy jeszcze metodę get zawsze
kiedy wywołujemy get get zwraca nam wartość która jest w środku
i w tym momencie też rzuca nam null pointer exception jeżeli w środku był
null get zawsze powinniśmy wywoływać w parze do is present tak
zawsze powinniśmy wcześniej to sprawdzić okej i teraz możemy spokojnie to uruchomić
okej to był taki mały wstęp do tego czym ten optional jest
i tak jaka motywacja jest za użyciem optionala chodzi
zasadniczo o jakby większą ekspresję wyrażania poszczególnych
jakiś takich stanów tak i tutaj jest przeniesienie też takiej
odpowiedzialności trochę na klienta tak tej metody albo
on się zastanowił jak obsłużyć daną sytuację tak wcześniej mógł
pamiętać o tym żeby sprawić czy to jest null czy to nie jest null teraz
my go zmusimy że musi sprawdzić coś a przynajmniej powiedzmy
zrobi tego geta tak może chwilę o tym pomyśli idea mu tam podświeci
że zrobił geta na przykład bez is present bo tak też się dzieje tak no
i będzie musiał powiedzmy jakoś to obsłużyć okej teraz przejdźmy do tego
jak możemy tworzyć te optionale bo tutaj też jest kilka takich subtelnych różnic okej
optionala zasadniczo możemy utworzyć na trzy sposoby pierwszy sposób który
już znamy to jest wywołanie of teraz of powinniśmy wykorzystywać
w momencie kiedy jesteśmy pewni że ta wartość w środku
nie jest nullem a jeżeli jest numerem to jest to bardzo bardzo
jakiś taki błąd krytyczny tak w sensie nie powinno
się w żaden sposób tak wydarzyć tak ta metoda jeżeli to co mu przekazałem
będzie nullem tak no to ona rzucili pointer exception w tym momencie
prawda druga metoda of nullable tutaj
możemy wrzucić coś co się albo spodziewałam że to będzie nullem albo nie
jesteśmy pewni na przykład tak więc możemy właśnie zrobić of nullable i teraz jak tutaj
trafi null to nic się nie stanie po prostu dostaniemy pustego optionala
tak czyli praktycznie tak jakbyśmy stworzyli optional empty i właśnie
ostatnia opcja to jest optional empty wiemy że jesteśmy w tym alternatywnym
scenariuszu więc zwracamy pustego optionala tak tak chcemy
na przykład wyrazić to że wartości w kolumnie nie było i to jest z punktu
widzenia tej metody może z punktu klienta nie ale z punktu widzenia tej metody
jest jak najbardziej poprawne okej i tutaj mamy taki przykład właśnie wykorzystania
tego mamy metodę która wykonuje dzielenie tak i tutaj jak
z dzieleniem wiemy możemy przekazać 0 tak jako dzielnik
no i wtedy byśmy dostali arithmetic exception teraz oczywiście załóżmy
że dzielenie przez zero w tym konkretnym w tej konkretnej sytuacji
nie jest błędem programistycznym tylko jest w jakiś sposób zwalidowane
i jeżeli po prostu wynik tego dzielenia nie ma sensu to nie rzucamy wyjątkiem
nie zwracamy nulla tylko zwracamy pustego optionala tak sprawdzamy czy jest
zerem dzielnik no i zwracając pusty optional
tak jeżeli nie jest to po prostu robimy optional of nie
of nullable ponieważ tutaj nie spodziewamy się nulla jakby był null to teraz
jest nawet niemożliwe tak więc wykorzystujemy of no
i zwracamy optionala i teraz klient tej metody jest
trochę zobowiązany do tego żeby prawidłowo obsłużyć obie sytuacje tak jeżeli
jest wynik no to jego wyświetlę a jeżeli nie no to dostarczę
jakiś alternatywny na przykład jakąś jakiś komunikat tak tę
samą sytuację możemy obsłużyć trochę bardziej tak funkcyjnie
tak wykorzystując takie chain'owanie metod możemy po prostu wywołać
map i map to jest metoda której przekazujemy pewną
lambdę tak i w tej lambdzie jest jakaś operacja która jest wywoływana
w momencie kiedy ten optional coś w nim jest tak ten result jest w tym momencie właśnie
optionalem naszym jak w nim jest wartość to wywołujemy te lambdy ona
się jakoś zmienia i leci dalej i jeżeli tutaj był empty no to
wtedy możemy dostarczyć właśnie ten alternatywny komunikat na przykład wykorzystując
or else i też jeżeli na przykład wywołanie powiedzmy
dostarczenie tej alternatywnej wartości wymaga jakiejś operacji którą
nie chcemy żeby była wywoływana za każdym razem tak tylko powiedzmy była w
takim trybie lazy trochę to możemy jeszcze zrobić or else get tak
i tutaj już dostarczamy supplier'a a nie a nie po prostu wartość
tak w jakimś innym kontekście możemy jednak chcieć uznać że
sytuacja kiedy dostajemy tego optional empty jest jak najbardziej nieprawidłowa
tak czyli to że nie dostaliśmy tej wartość w tym miejscu tak
jakby powinniśmy rzucić wyjątkiem że jest to błąd programistyczny i tutaj możemy
wykorzystać na przykład or else throw ale w tym momencie przechodzimy już na stringa
tak czyli na wartość którą tutaj zmapowaliśmy a jeżeli wcześniej
nie było tego tutaj tutaj mieliśmy empty to jest po prostu rzucony wyjątek
no i w ten sposób zachowując bezpieczeństwo typów możemy dostać
właśnie tego stringa tutaj i tutaj nigdy nie będziemy mieli nulla możemy
też wykorzystać or else throw wersję przeciążona i tutaj dostarczyć
supplier'a który nam da wyjątek który chcemy rzucić tak
i możemy dostarczyć jakiś własny komunikat jeszcze jedną rzeczą
kiedy możemy użyć tego optional'a to jest sytuacja kiedy właśnie wywołujemy jakąś
metodę której nie jesteśmy w stanie zmienić sygnaturę aby ona nam zwracała
optionale tak i tu jest powiedzmy jakaś metoda z jakiejś biblioteczki
to po prostu wtedy wywołujemy ją of nullable też zobaczymy że
niektóre api na przykład mapy tam nie ma takiej opcji żeby
ona na przykład nam zwróciła optional'a ona czasami po prostu robisz get na mapie
i ona ma opcję aby zwrócić domyślną jakąś wartość lub na przykład zwrócić
null'a no to wtedy jesteśmy trochę zmuszeni używamy po prostu of nullable w takiej
sytuacji i obsługujemy tak jak nam jak dla nas to jest wygodne okej to
co chciałem powiedzieć o optional'u dzięki wielkie i do usłyszenia w kolejnym odcinku