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.
Pierwszą rzeczą którą powinniśmy zrobić zaczynając
implementację naszego projektu to dodanie klasy
naszego wydatku czyli pewnego modelu w którym będą przechowywane dane jednego
wydatku stwórzmy taką klasę taka klasa
niech nazywa się outcome musimy ją wypełnić polami
które będą po prostu danymi które odpowiadają temu co mamy wymagania
tak czyli będzie to pewnie jakaś data jakiś komentarz oraz
kwota niech to wygląda w ten sposób mamy id komentarz
czas oraz kwotę będziemy przechowywali jako bigdecimal
czyli będziemy przechowywali ją razem z przecinkiem tak czyli złotówki
i grosze a później po przemapowaniu do bazy danych będziemy to zamieniali na grosze
z tego względu że sqlite nie posiada takiego obiektu
takiego typu danych który byłby bezpieczny do przechowywania kwot jako
typ do przechowywania czasu wystarczy nam offset
date time wygenerujmy do tego sobie gettery i settery tak
jest oraz teraz nam to nie będzie potrzebne
ale chciałbym pokazać jeszcze jedną rzecz możemy sobie wygenerować equals i hash code i
tutaj w kontekście equals'a i hash code'a jest jedna taka
kontrowersyjna rzecz w kontekście przechowywania obiektów bazy
danych jeżeli mamy obiekty jakiejś klasy tak których obiekty mapujemy
na jakieś wiersze w bazie danych tak jak my to będziemy robili to
często kontrowersyjne jest to czy id powinien się znajdować w
hash code i equals'ie tak jak tutaj jest wynika
to z tego względu że ten id tak często jest nadawany w momencie wrzucenia tego
obiektu do bazy danych i teraz jeżeli hash code używa
id tak do wyliczenia powiedzmy tej wartości tego integera
no to jeżeli używamy dziś tego obiektu
jak klucze na przykład w hash mapie no
to on ten hash code jest liczony w momencie wstawiania do mapy czyli
powiedzmy jeżeli dodamy coś do mapy później ten obiekt dostanie
ten sam obiekt ta sama referencja dostanie tego id no to
wtedy jest taki problem że jeżeli po tym po tym obiekcie będziemy szukali
w tej mapie to już nie znajdziemy nie znajdziemy tego obiektu tej wartości dla tego
klucza z tego względu że hash code był wyliczony i został zapamiętany
w momencie wstawienia do mapy i w momencie kiedy szukamy po tym obiekcie
to ten hash code będzie inny już pomijając to że equals jeżeli on też
ma w sobie id to on nam się w ogóle nie zmatchuje prawda no
my nie potrzebujemy tych tych metod dobrze jest je dodać ale my nie
będziemy ich używali więc na razie wstawmy sobie domyślną implementacje czyli bazującą
na referencjach jeszcze dodajmy tutaj sobie konstruktory
i to będzie jeden konstruktor który zawiera wszystkie pola oraz
jeden konstruktor który zawiera tylko pola bez id
tak ten pierwszy konstruktor będzie używany w momencie tworzenia nowego
wydatku tak czyli w momencie kiedy dostajemy dane od użytkownika to dostaniemy
tylko te trzy dane bez id tworzymy ten obiekt w id
zostaje null wysyłamy to gdzieś tak żeby zostało zapisane w bazie danych i
wtedy dopiero przy wyciąganiu tego obiektu moglibyśmy dostać id i
do wyciągania obiektu z bazy właśnie będziemy używali przy przemapowaniu
tego konstruktora tak jeszcze jedną rzeczą którą warto sobie
wygenerować to na potrzeby jakiegoś debugowania jakiegoś powiedzmy wyświetlania
to dobrze sobie jeszcze dodać tu stringa jakiegoś ładnego okej
używając takiego właśnie outcome'u jak tutaj mamy takiego obiektu
w modelu możemy iść dalej