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 poprzedniej lekcji przyjrzeliśmy się
jak tworzyć executor serwisy oraz jak je zamykać oraz jakich problemów
możemy się spodziewać przy tym a w tej lekcji postaramy się dopracować teraz
te klasy które wykorzystywaliśmy już te jak main sender tak żeby
były trochę bezpieczniejsze okej tutaj przypomnę że jeżeli robimy
na przykład execute tutaj podajemy jakieś domknięcie jakąś lambdę tak
w której korzystamy na przykład z jakiegoś mail sendera czy jakiegoś zewnętrznego
tutaj obiektu i na nim robił na przykład send mail tak
no to ten obiekt powinien być thread savety to jest jedna rzecz tak a druga
rzecz to jest to że tutaj co prawda ten
executor service pewnie jest globalny tak ale
równie dobrze my moglibyśmy zamiast wywoływać mail sender'a
tutaj powiedzmy send maila z tego miejsca na tym executorze tak
to może lepiej by było żeby ten mail sender dostawał
tego egzekutora tak gdzieś z zewnątrz byśmy mieli jeden mail sender
spokojnie na całą powiedzmy aplikację czy tam powiedzmy na ileś
tam wywołań tak oczywiście musielibyśmy zapewnić żeby on był thread safety
tak ale zasadniczo fajniejszy byłby trochę interfejs w którym zamiast
robić execute robimy sendmail tak zróbmy
coś takiego po prostu możemy przekazać naszego executor service w konstruktorze
tak i tutaj w send mailu po prostu robimy execute prawda
no i teraz mamy ładny interfejs możemy po prostu robić na naszym
senderze send mail teraz nie robimy jakichś takich pokracznych wywołań na executor
service robimy execute z jakąś lambdą prawda już teraz to dużo ładniej wygląda okej
nasz interfejs się trochę uprościł teraz ale zauważmy że ten mail
sender może być wykorzystywany z różnych miejsc prawda na przykład w jednym
miejscu w kodzie nie będzie nas obchodziło to że ten send mail się
wykonuje asynchronicznie tak i powiedzmy gdzieś w tle będzie wywołany
mail i to będzie okej tak ale w innych miejscach moglibyśmy chcieć
jednak zaczekać na wynik wywołania tej metody prawda i w tym momencie jeżeli
robimy execute tutaj pod spodem na jakimś zdalnym executor serwisie
którego niekoniecznie mamy do niego dostęp w tym miejscu tak no
to nie wiemy nic my dostajemy jakiegoś void'a dostajemy tak
nic nie możemy z tym zrobić no i to jest powiedzmy takie dla
niektórych ten interface będzie odpowiadał dla niektórych niekoniecznie okej dlatego
z tego miejsca możemy też zwrócić coś co jest
future zamiast robić execute na executor service możemy
zrobić submit i submit mamy w kilku powiedzmy jakich przeciążeniach
jednym z nich jest runnable bo jeżeli nasz powiedzmy kodzik
niczego nie zwraca w tym momencie prawda w tym momencie submit zwróci nam
coś co się nazywa future i future to jest powiedzmy taki uchwyt na coś na
wynik jakiejś operacji która jeszcze się nie zakończyła i teraz jesteśmy
w stanie to zwrócić na przykład ale oczywiście poprawimy trochę nasz
interfejs tak naszego send maila i teraz dostajemy tutaj future
od znak zapytania czyli tak czegoś co nie jesteśmy w
stanie zrobić powiedzmy w tym momencie to nic nie zwróci tak ale
ciągle możemy wziąć tego future'a tak i teraz możemy
na nim zrobić na przykład get sobie zobaczymy tak robimy get
i w tym momencie w niektórych miejscach naszej aplikacji możemy wymusić okej to
jest asynchroniczna operacja tak ona się wykona jakoś w przyszłości moglibyśmy
od razu zwrócić na przykład sterowanie ale my chcemy tutaj świadomie zaczekać
na to co się wydarzy tak no i tutaj możemy właśnie zrobić get jak robimy
get no to w tym momencie blokujemy więc oczywiście trzeba obsłużyć teraz
exeption tak załóżmy że go sobie na razie wyrzucimy na zewnątrz nie interesuje
nas to to jest po prostu przykład tak no i w tym momencie my zaczekamy na ten
czas czyli powiedzmy tutaj będziemy czekali w dwie sekundy które są w send mail dokładnie
geta też żeby
unikać takich sytuacji że zablokujemy się wiecznie tak no to
tutaj możemy jeszcze dać pewien timeout to jest też dobra praktyka i później na przykład najlepiej
ten diamond brać gdzieś z konfiguracji go tutaj wstrzykiwać tak
żebyśmy mogli zdalnie powiedzmy na środowisku już pozmieniać sobie tą konfigurację
warto być świadomym tego że jeżeli robimy get i
wewnątrz tej operacji którą wrzucałem w submita poleci jakiś wyjątek to
w miejscu tego geta my też go dostaniemy teraz możemy to sobie zobaczyć co się wydarzy i jak widzimy
poleciał nam wyjątek i on przeleciał też przez main w tym miejscu prawda no
i też co za tym idzie oczywiście nie zostało wykonane shutdown i await termination na
naszym powiedzmy executor service więc też jest dobrze je opakować w jakiś
try catch tak jakiegoś więc warto być tego świadomym że get też
w tym momencie tak jakby te wyjątki które wszystkie polecą
w naszej operacji zostaną przeroutowane do tego miejsca okej teraz zobaczymy
sobie trochę inny przykład mamy teraz już user service a nie mail service tak
mail sender i user service chce nam asynchronicznie zwrócić username
jakiś prawda ok dla jakiegoś id tak on bije do jakiegoś powiedzmy
serwisu czy coś takiego i teraz jeżeli jesteśmy w executor service
tak używamy go tutaj pod spodem robiąc submit możemy
już zamiast runnable przekazać callable bo tak możemy spokojnie tutaj
zrobić return prawda i dzięki temu ten future który jest zwracany z
tego submita on w środku zawiera stringa tak on oczywiście
też się może ta operacja wywalić tak ale jeśli przejdzie prawidłowo to
używając geta jesteśmy w stanie teraz wyłuskać ten result tak
jestem w stanie wyciągnąć jeszcze tego stringa jak widzimy dostajemy dokładnie
to to że to jest wykonywane na drugim wątku nie jest problemem w tym momencie ten
future sprawia że wyciąganie tych wartości z
drugiego wątku jest bezpieczne tak jak byśmy na przykład w tej operacji mieli
zmieniać stany jakieś globalne czy mapy czy czegoś takiego no to to już jest taka
współdzielona zmienna globalna to nie jest dobry pomysł tak a w ten sposób jest
to jak najbardziej bezpieczne okej to wszystko co chciałem ci pokazać w tej lekcji do
usłyszenia w kolejnej