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.
W poprzedniej lekcji zobaczyliśmy jakie typy służą do przechowywania czasu
lokalnego w javie a w tej lekcji przyjrzymy się klasom które służą do przechowywania
czasu już przypiętego do jakiejś zony offsetu upraszczając
trochę w javie do przechowywania czasu który jest przypięty
do jakiejś zony mamy z grubsza trzy typy jest to instant
offset daytime oraz zonedaytime powiedziałem że
w uproszczeniu go omijamy tutaj jakieś klasy które są powiedzmy ze
starego api oraz offset daytime posiada jeszcze offset
time dobra i teraz jakie są między tymi czasami różnice każda
z nich przechowuje prawie to samo tak jakiś czas w jakiejś zonie pierwszym
takim wyróżniającym się trochę najbardziej z nich wszystkich jest instant instant
to taki pojemnik na czas który jest tylko i wyłącznie w utc
możemy z niego przeskoczyć do innych stref czasowych tak
innych offsetów ale on wewnątrz je przechowuje w utc tak
czyli ten czas strefy zero tak możesz
myśleć o instancie jako takim zasobniku który zawiera wewnątrz liczbę
sekund oraz nanosekund od 1970
roku 1 stycznia tak godziny 00
de facto instant wewnątrz właśnie tak przechowuje ten czas oraz
tak jak mówiłem możemy z niego przejść do pozostałych czasów tutaj
offset daytime lub zone daytime podając odpowiednią
zone bądź offset okej czym jest offset daytime i czym jest
zone daytime i tutaj mamy listing tego co zostało wyprintowane poprzez
uruchomienie tego programu i widzimy tutaj nam się wyprintował instant
on ma tutaj z od zulu tak to jest czas w utc
dokładnie a tutaj mamy właśnie to co zostało wyprintowane z
offset data time i to jest po prostu czas który ma offset
jest to offset plus 1 i on jest do tego setu
przypięty na stałe co to dokładnie oznacza zobaczymy za
chwilę okej i mamy jeszcze zone data time który
poza tym że zawiera powiedzmy w danym momencie offset to
też zawiera dokładną informacje o zonie tak możemy
powiedzieć pewnego rodzaju zone id z tego względu że mam ustawiony teraz czas
na lokalny czas w polsce tak czyli europe warsaw
tak to mam w tym momencie plus jeden można się zastanowić jaka
jest różnica co wynika z tego że tutaj mam tylko offset a tutaj
mamy całą zonę zauważ że niektóre państwa czy obszary
znajdują się w jednej zonie tak jakimś jednym powiedzmy
strefie czasowej ale zmieniają na przykład co
to jest dokładnie za offset tak na przykład mamy czas jesteśmy
w strefie czasowej warszawskiej czy może polskiej tak
ale to w zimę i w lato będzie znaczyło coś innego
trochę bo powiedzmy w zimę będziemy mieli plus jeden tak ale
już w lato będziemy mieli plus dwa i tutaj jest właśnie taka różnica że
zone data time jest tego świadomy a offset data time nie
offset data time on ma na sztywno wbite po prostu co to jest za offset
i tam się po prostu już nie zmienia okej teraz przyjrzyjmy się każdej z
tych klas oddzielnie zaczynamy od instanta instant
poza tym że możemy stworzyć go z now możemy go też również utworzyć
na przykład podając na przykład epoch czy mili w ogóle instant często jest
kojarzony z timestampem lub nawet bardziej unix
timestamp tak czyli liczbie milisekund bądź
sekund od czasu 1970 roku
tak 1 stycznia tutaj właśnie mam taką prezentację tak możemy po
prostu ją tej wrzucić i utworzyć od tego instant to oczywiście jest liczba
milisekund od 1970 w
czasie utc możemy również z instanta wyciągnąć te
milisekundy możemy też wyciągnąć same sekundy
get epoch second tak wtedy po
prostu stracimy taką dokładność jak mamy już instanta to
możemy go łatwo zamienić na czas w konkretnej zonie bądź offsecie tak
on jest powiedz mi pewną bazą do której możemy na przykład dodać offset
i wtedy on nam się odpowiednio skonwertuje wewnątrz oczywiście punkt
w czasie to będzie dokładnie ten sam ciągle tutaj możemy stworzyć offset date time
podając offset jest to offset plus 1 tak of hours
plus 1 gdybyśmy dali tutaj minus 1 możemy
też z instanta zrobić zone date time tylko tu już musimy podać konkretnego
zone i id i teraz taka ciekawostka to że zoneoffset też
jest zone id on po prostu po nim dziedziczy tak zone offset
jest zone id ale powiedzmy jest to taka strefa
trochę taka uniwersalna nie dokładnie świadoma tych zmian ponieważ
jeżeli chcemy powiedzmy dostać dokładny czas dokładną
żonę to musimy tutaj powiedzmy powiedzieć no okej ale
o której obszar nam dokładnie chodzi tak bo tutaj w tej powiedzmy w tym offsecie jest dużo
dużo miejsc tak możemy też powiedzmy
traktować ten offset jako taką zone powiedzmy z takim stałym
czasem stałym offsetem tak okej tutaj możemy oczywiście tutaj
sobie wyprintować i odpowiednio inaczej nam będą wyglądały te elementy tak tutaj mamy
europe warsaw okej i w ten sposób przeskończyliśmy do zone data time
tworząc zone data time możemy stworzyć na przykład now
i teraz dostaniemy teraz tak w
tym czasie który jest u nas ustawiony domyślnie na systemie
tak czyli w moim przypadku jest to warszawa tak możemy też wskazać
że to ma być now ale już są w tej
zonie dla odpowiednią na przykład dla nowego jorku dla sydney i gdybyśmy
zrzutowali teraz każdą z tych dat powiedzmy na instanta tak
czyli do utc to będzie dokładnie ten sam punkt w czasie oczywiście tutaj prawie
jest z pominięciem tego że między wywołaniami tego now mija kilkanaście
tam milisekund gdy mamy zone date time możemy
z niego wyciągnąć offset i zone w przypadku offsetu to dostaniemy
po prostu offset w którym jest ta data którą podaliśmy
tak tak ten czas i data którą podaliśmy do tej klasy tworząc ją a
zona to jest dokładny zone id tak zauważ że ten offset który tu jest
zwracany na przykład w przypadku warszawy jest zależny
od tego jaką datę dokładnie ustawiliśmy w tym zone data time bo
raz tu będzie zwracane plus 1 a raz będziesz plus 2 tak dopóki mamy czas
zimowy i letni w polsce i teraz zamiast przerabiać czym dokładnie
jest offset data time tak i przerabiając te wszystkie metody raczej
z kontrastujmy go czym on się różni w stosunku do zone data time tak
jak mówiłem zone data time to jest czas który jest świadomy konkretnej
żony offset data time też jest świadomy konkretnej zony ale
jest to trochę bardziej taka ułomna ogólna zona tak jest to
powiedzmy zona która jest konkretnym offsetem przypadku zone data time to
też może być konkretny offset tak czyli powiedzmy stały ale też może
to być jakaś zona która powiedzmy w zależności od konkretnej
daty będziesz zmieniała swoją strefę jak na przykład właśnie w polsce tutaj sobie
utworzyłem offset data time poprzez sprasowanie tak jakiegoś
ciągu znaków oraz utworzyłem zone data time poprzez pobranie tego
dokładnie tego samego punktu w czasie tylko zapisanie go w innej zonie tutaj
już podając po zone id czas warszawski tak no i tutaj akurat
dla tej daty ten offset jest dokładnie ten sam będzie też plus dla okej
tutaj dalej sobie wyprintujemy co to robi tutaj poza tym że mamy offset
data time plus 2 mamy zone date time to jeszcze wyprintowałem jaki
jest instant od tego offset data time możemy mieć odniesienie co
jest dokładnie w utc w tym momencie okej i teraz nasze ćwiczenie będzie
polegało na dodaniu jednego dnia do odpowiednio
offset i zone date time time i zobaczenie jak on się zachowa w tym momencie zauważ
że ta data którą tutaj podałem to jest 27 października tak
czyli to jest dzień przed zmianą czasu z letniego na zimowy 28
o 3 po prostu cofamy zegarki no i zobaczmy jak teraz się
zachowują poszczególne klasy dodaliśmy jeden
dzień do offset datatime tak tutaj mieliśmy 27 dwunasta i
mamy 28 12 też plus 2 i widzimy że w utc
godzina się nie zmieniła jest dalej 10:00 i jest to 28 po prostu
okej a w przypadku zone date time mamy trochę coś innego mamy 12:00
tak jest ona w plus 1 tak czyli powiedzmy
godzina została strefa się zmieniła to jest pierwsza rzecz dzień się oczywiście zmienił
ale jak to zobaczymy sobie co to jest w utc to tutaj mamy
11:00 czyli dodanie jednego dnia do offset date time
dodało nam 24 godziny a dodanie jednego dnia
do zone data time dodało nam 25 godzin tak teraz
o co chodzi zone date time jest świadomy
tego że jest w jakiejś zonie jest świadomy też tych wszystkich historycznych i powiedzmy
sprecyzowanych do tej pory przyszłych zmian czasowych dla
poszczególnych zon no i on wykrył że tutaj jest powiedzmy
w tym przy tym dodaniu jest przejście do innego offsetu i
on tak by default wykorzystując plus days stara się
zachować tę samą godzinę tak zmienia offset ale godzinę stara
się zachować tę samą czyli w tym wypadku kiedy powiedzmy jest moment
kiedy cofamy zegarki w przejściu to on doda nam więcej tak żeby zachować
tę samą godzinę żeby ciągle mieć 12:00 ale jeżeli będziemy na przykład przechodzili
do czasu z zimowego na letni to
on doda nam 3 godziny tak czyli on będzie to
i tak manipulował starając się zachować tą samą godzinę i jeżeli mamy zone data
time i chcemy żeby on nam przy zmianie strefy
tak dodał dokłanie 24 godziny tak czyli zależy nam
na tym dodaj 24 godziny i zobaczymy która to godzina wyjdzie tak
nie manipuluj przy tym to tutaj musimy wykorzystać trochę inną operacje jest to
plus i plus dostaje temporal amount tak i tutaj
ważne jest żeby dodać plus duration jest to taka klasa służąca
do przechowywania czasu trwania tak duration of days i tutaj też
dajemy 1 i teraz jak to sobie wywołamy to on dodał nam
teraz dokładnie 24 godziny pod tym jednym dniem tak i
widzimy że mamy 11:00 oczywiście strefa też się zmieniła bo to jest zone date time
ale mamy 11:00 i widzimy że w utc jest to
dokładnie to samo co w przypadku offset date time tak czyli reasumując offset date time
jest na stałe osadzony w jakiejś strefie jakimś offsecie
nawet bardziej tak nie zmienia tego ogffsetu i nie kombinuje jak
do niego dodajemy odejmujemy tak jakiś czas a zone offset
date time on już tak jest po pierwsze świadomy tego tych przejść
czyli będzie manipulował powiedzmy przy tym tak jeżeli zmienimy to on nam
tutaj zmieni ten offset a dodatkowo w niektórych jego operacjach on
jeszcze próbuje zachować tą samą porę czyli jeżeli mieliśmy 12:00 zmienił
nam się offset to on ciągle będzie się starał zachować 12:00 tak może być to czasami
trochę mylące na tych klasach które tutaj zobaczyliśmy możemy wykonywać
podobne operacje jak na klasach służących do przechowywania czasu lokalnego też
możemy wywołać truncate i możemy odpowiednio powiedzmy zamieniać to w string
przez formatowanie tego czasu tak jest to dość podobne okej jeżeli
chodzi o takie pobieżne przedstawienie co potrafią te klasy to byłoby to wszystko i
teraz pytanie jest kiedy używać czasu lokalnego a kiedy używać czasu
takiego przypiętego do zony moim zdaniem jeżeli nie masz kiedyś bardzo konkretnego
powodu do używania czasu lokalnego to
używaj czasu przypiętego do jakiejś zony instant powiedzmy większości wypadków
będzie wystarczający nawet jeżeli twój system twoja aplikacja jest na przykład
aplikacją używaną w jednym kraju powiedzmy jest aplikacją
wewnętrzną jakiejś firmy i prawie mamy 99% pewności
na to że wszelkie czasy które się w nim pojawią będą czasami lokalnymi
tak w sensie z tej samej strefy to moim zdaniem mimo wszystko
lepiej używać instanta bądź jakiegoś powiedzmy właśnie zone data time
chociażby żeby być nie wrażliwym na zmiany strefy w przypadku kiedy
nasza strefa powiedzmy zmienia swój offset w trakcie roku bo pamiętaj że jeżeli
mamy lokal date time tak to tam godzina
na przykład 3:00 w przypadku 28 października pojawi nam się dwa razy
no i też pytanie czy twój system powiedzmy jest na to gotowy czy nie można
by się zastanowić kiedy używać instant a kiedy używać na przykład zone date time instant
powiedzmy ma trochę mniej danych niż zone date time czy
offset date time jest on wystarczający jest on bardzo wygodny jeżeli
chcemy przedstawić powiedzmy na punktach na jakiejś osi czasu
kiedy poszczególne wydarzenia miały miejsce tak jakaś transakcja wpłata wypłata
tak wysłanie maila i tak dalej ale jeszcze dodatkowo
zone date time i offset date time mają tę taką lekką podpowiedź
w jakim miejscu w jakiej dokładnie strefie czy offsecie była robiona
ta próbka tego czasu tak czyli powiedzmy przeglądając bazy danych
mam na przykład informacje ok klient zrobił w tym czasie
jakąś transakcję i widzimy że on jest w jakiejś na przykład
strefy z jakiejś na przykład jest z nowego jorku tak oczywiście
jeżeli się uprzemy to tę strefę czasową da się podmienić tak ale
powiedzmy mamy lekkiego takiego hinta okej jeżeli chodzi o klasy służące
do pracy na czasie przypiętym do jakiejś zony to jest wszystko dzięki
wielkie i do zobaczenia