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 pokażę ci jak radzić sobie z wyjątkami
wewnątrz lambd tak żeby nie stracić na ich czytelności i tutaj mamy
kot z poprzedniej lekcji z małą zmianą metoda send mail teraz
zrzuca ioexception tutaj w jej implementacji jest po prostu rzucany
ten wyjątek oraz ta metoda propaguje go dalej ioexception nie jest check
exception czyli to jest taki wyjątek który musi zostać obsłużony nie można go przepuścić
tak nie może on sobie po prostu przelecieć niejawnie tylko wszystko
co wywołuje taką metodę musi go obsłużyć albo też jeżeli
jest to metoda to musi ona też by mieć tak teraz to że
mamy tutaj to ioexception sprawia że nie jesteśmy w stanie podać
tutaj uchwytu do tej metody ponieważ jest to nieobsłużony właśnie
wyjątek ioexception możemy sobie z tym poradzić najprościej poprzez
zamianę tego na lambdę więc tutaj możemy dodać stack trace tak
po prostu złapać wyjątek odpowiednio go obsłużyć i teraz zazwyczaj
obsługa takiego wyjątku nie zawsze będzie w stanie tutaj podjąć
odpowiednią decyzję tak zresztą jesteśmy wewnątrz jakiegoś powiedzmy foreach
i możliwe że to że tutaj doszło do wyczucenia powiedzmy
wyjątku powinno być przerzucone gdzieś wyżej i jakieś serwisy
jakiś powiedzmy kod który jest bardziej świadomy kontekstu
albo zarządza na przykład czy to całym kontenerem czy całą aplikacją może
chcieć wiedzieć otym dlatego zazwyczaj będziemy tutaj throw'owali czyli
będziemy robili throw po prostu i będziemy rzucali nowy wyjątek ja tutaj rzucę
runtime exception często będzie tak że będziemy chcieli stworzyć jakiś
nasz wyjątek nasz własny z tego względu że runtime exception jest bardzo szerokim
wyjątkiem wszystkie wyjątki które są uncheck dziedziczą potym wyjątku
teraz sobie rzucimy ten wyjątek i teraz może nam to wszystko się skompilować no
ale pojawia nam się kolejny problem z tego względu że tutaj mam tego
try catch tak to musieliśmy zrobić tą lambdę blokową tak no i
tego się tak już przyjemnie nie czyta mamy powiedzmy to tak ten fragment to i
to jakąś obsługę tego wyjątku tak naprawdę to co powinniśmy mieć tutaj to najfajniej
gdybyśmy mieli tylko tego send maila tak jak na początku tak ten check exception
nam tam tutaj trochę popsuł i teraz jak możemy sobie z tym radzić pierwszą rzeczą
którą możemy zrobić to jest przeniesienie obsługi tego wyjątku do
wnętrza sendmail okej ten fragment tutaj już wygląda ładnie
mamy tak samo jak na początku send mail wygląda teraz brzydko tutaj wewnątrz
mamy ten throw new io exception na potrzeby przykładu oraz
tą obsługę no i w ten sposób możemy tutaj przenieść sobie właśnie powiedzmy
ukryć tą obsługę do send mail ale i to w większości sytuacji
pewnie będzie taka preferowana opcja nawet jeżeli ten fragment tutaj
jest jakąś metodą powiedzmy z jakiejś biblioteki na razie sobie tak nazywałem
tylko to ciągle jesteśmy w stanie to pakować tą metodą tak
tutaj moglibyśmy wywoływać metodę która
jest nasza i w niej po prostu to handlować a jeżeli musimy
wywołać metodę z jakiejś innej biblioteki która rzuca ten wyjątek
no to po prostu tworzymy na nią metodę takiego wrappera no i teraz
kolejnym rozwiązaniem które moglibyśmy to poza przenoszeniem tego
tutaj do tego send maila to wykorzystanie jakiegoś już wrappera tutaj
pomiędzy który jest w stanie handle'ować na wyjątek jest
w stanie złapać io exception i go obsłużyć zauważ że to wcale nie
jest tak że w jakiejś powiedzmy w lambdzie nie możesz rzucać wyjątku
tylko to jest tak że ten io exception
jest fragmentem sygnatury metody a ta sygnatura musi
pasować do tego co tutaj jest w tym w tym consumerze
tą metodą abstrakcyjną tak czyli do accept'a accept nie
może rzucać prawda no ale możemy też stworzyć jakiś nasz własny
interfejs funkcyjny wtedy możemy do tej wpasować tutaj zrobię taki przykład
okej tutaj zastosowałem taki wrapper to jest metoda
używająca która powinna dostawać konsumenta i
teraz trochę inaczej działa z tego względu że tutaj musimy opakować
tym handler'em później dodajemy tego właśnie tego tą
lambdę znaczy tą referencje do metody która jest wpasowana do metody abstrakcyjnej
która jest w tym thrownig consumer i interfejsie funkcyjnym który tu stworzyłem
i on już robi throw exception tak ja
utworzę właśnie w tej metodzie podaję throwing consumera który
ma throw'ować io exception między nimi prawda to jest akurat podprzykład
tak bo to mogłyby być bardziej generyczne tutaj te typy mogłyby
być to typy generyczne do tej metody i ta metoda mogłaby wychodzić na zewnątrz
tak ale okej to nam tutaj zadziała okej no
i tutaj zasadniczo to decyzja należy do osoby która programuje
moim zdaniem taki handler tutaj ma
pewne ograniczenia lepiej jest obsłużyć z mojego punktu widzenia tego send
w tym send mailu z tego względu że taki handler
ta metoda ona jest zafiksowana
na tym jakiego typu tutaj będzie powiedzmy ta
lambda tak tutaj będzie interfejs funkcyjny tutaj jest na razie throwning consumer ale
musielibyśmy taką metodę napisać dla funkcji dla
jakiegoś supplier'a tak dla wszystkiego co chcemy obsłużyć dla każdego
oddzielnie no więc to jest trochę rzeczy do napisania prawda tak więc wybierz
którą z tych metod chcesz wykorzystywać ale najważniejsze to staraj się unikać
obsługi tych wyjątków wewnątrz lambdy wewnątrz
bloku tak po prosto jest to nieczytelne okej to tyle w kwestii exception'ów
dzięki wielkie i do zobaczenia