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 przypomnijmy sobie podstawowy syntax związany
z wykorzystaniem typów generycznych w javie zaimplementujemy
klasę tuple która jest krotką jest parą
dwóch obiektów i dzięki wykorzystaniu typów generycznych
będziemy mogli być bezpieczni pod względem przypisywania
tych obiektów dalej ponieważ nie chcemy się fiksować na konkretny typ z
jakim będzie z jakim będzie pracowała ta klasa ponieważ
jest to kontener który może być użyty w wielu projektach jako biblioteka na przykład wykorzystałem
właśnie tam typy generyczne od lewego i prawego elementu przejdźmy
do implementacji zacznijmy od nagłówka naszej klasy tuple
wiemy że będzie przechowywała ona obiekty dwóch
oddzielnych typów już na etapie deklarowania klasy powinniśmy
zadeklarować typy generyczne robimy to w trójkątnych
nawiasach nazwałem te typy odpowiednio r i l
a dla lewej i prawej strony tej krotki zacznijmy do przejdźmy do implementacji konstruktora
okej już na etapie implementacji konstruktora
odwołujemy się do typów zadeklarowanych na poziomie klasy tutaj
te obiekty które dostajemy od razu sobie przypiszmy jako pola w
w naszej klasie tu jak widzimy że na poziomie tych
fieldów ona już też dostała właściwy typ tak jest to odpowiednio
l i r teraz zaimplementujmy jeszcze metody pozwalające
na dostanie się do odpowiednio lewej i prawej strony widzimy że na poziomie
metod też już wykorzystujemy lewą i prawą stronę tak
typy generyczne teraz przetestujmy działanie naszej klasy w metodzie main
okej stworzyliśmy obiekt klasy tuple tutaj
odpowiednio dodaliśmy z lewej strony daliśmy tekst z drugiej strony daliśmy
mu integera ala zapisaliśmy to do zmiennej zauważył że tutaj
nie musieliśmy już podawać jakiego typu są jakie
są dokładnie typy generyczne ponieważ kompilator wyinferował domyślił
się tego za nas poprzez przez to że zajrzał po prostu jakiego typu
elementy które podajemy tutaj wyciągnęliśmy
sobie odpowiednio lewą i prawą stronę i zauważ że dzięki
temu że używamy typy generyczne nie jesteśmy w stanie przypisać lewej
lewej strony do prawej strony left na przykład no
nie pozwoliłem na to bo próbujemy wepchnąć stringa do integera kolejną
rzeczą którą to żebyśmy zauważyli jest to że w momencie kiedy
przekazałem jedynkę do tuple tak jako ten parametr on
potraktował kompilator potraktował to jako integera to jest taka
ważna rzecz dokonał się auto boxing czyli zamiana typu
prostego tego primitive czylii inta na integera
i dziś tak dlatego że w typach generycznych nie możemy primitive
nie możemy mieć na przykład tuple od char'a
możemy mieć tylko tumple od charakter dlatego musimy odpowiednio
tutaj w większości przypadków to zostanie z nas ale jak
deklarujemy na przykład typy generyczne to nie możemy na przykład tutaj
zadeklarować że to jest int tak po prostu nie zadziała w ten
sposób przypomnieliśmy sobie składnie deklarowania
typów generycznych na poziomie klasy teraz dodeklarujemy jeszcze taki typ na
poziomie metody zdefiniujmy sobie metodą statyczną czyli
metodę która należy do klasy tuple i która jest wywoływana nie na konkretnym
obiekcie tylko na klasie która będzie przyjmowała jeden parametr
jakiegoś generycznego typu oraz będzie zwracała krotkę która
jest po prostu podwojonym tym parametrem tak okej i zaimplementowaliśmy tę
metodę tutaj zauważ że ten
typ generyczny definiujemy najpierw a następnie dopiero definiujemy
typ jaki jest zwracany przez metodę tak tutaj
gdybyśmy wywołali też wykorzystali typ l to
zauważ że w przypadku metody statycznej nie możemy się odwoływać
do typów na poziomie klasy z tego względu że ten typ należy
do klasy ale dokładnie do obiektu tej klasy tak czyli
dopiero przy tworzeniu tego obiektu wiadomo co t jest więc nie możemy tego
l wykorzystać w tym miejscu a ponieważ
to l jeszcze nie jest zdefiniowane tak w metodzie statycznej a który jest
metody statyczne są w oderwaniu od obiektów zwróć uwagę w jaki
sposób nazywamy typy generyczne jest to wielka litera nawiązująca
do tego co stoi za tym typem jest tu element i to jest duża litera
a wielka litera e oraz l dla left i r dla right
jest to dość szeroko używana konwencja też zauważysz że
w różnych metodach w sdk javy jest to wykorzystywane okej
przypomnieliśmy sobie ten syntax do tego w kolejnych lekcjach
już przejdziemy do bardziej zaawansowanego wykorzystania typów genetycznych dzięki
dzięki i do zobaczenia