Nurtuje Was pytanie czy warto uczyć się Javy w 2021 roku? Faktem jest, że ja korzystam z tego języka dopiero od drugiego roku studiów, niemniej jednak jestem w stanie stwierdzić czy moim zdaniem jest sens zawracać sobie nim głowę. Tym bardziej, że mam zamiar jeszcze pisać w nim programy w przyszłości. Sprawdźcie już teraz moją opinię na ten temat oczywiście "postawioną" na argumentacji. Nie tylko za, ale również przeciw.
Na dzisiaj mam dla Was coś specjalnego na temat języka Java. Czy zdajecie sobie sprawę, że mogliście wielokrotnie źle korzystać z łańcucha znaków od czasu utworzenia instancji? Dowiedzieliśmy się już znacznie wcześniej, że łańcuch znaków w języku Java sprawia trudności w języku C, aczkolwiek w Javie też jest pewna pułapka i to o wiele bardziej perfidna, bo niedająca po sobie niczego poznać. Zapraszam serdecznie, to jest bardzo ważny wątek!
Kontynuujemy wątek dotyczący pakietów, aby traktować go jako drugi krok do tego, jak należy PRAWIDŁOWO ręcznie kompilować kod źródłowy w języku Java. Proszę o cofnięcie się wstecz jeśli nie przerobiliście tamtego etapu, jest on kluczowy, żeby zrozumieć, a także utworzyć własny archiwum JAR w języku Java. Zapraszam.
Poruszymy dzisiaj wszystkie trzy kolekcje w języku Java (a raczej ich rodzaje): "List", "Set" i "Map". Dosyć sporo się już napisało o niektórych konkretnych kolekcjach, więc warto teraz poznać te trzy typy, skonfrontować je między sobą, pokazać ich najlepsze zastosowania oraz zalety i wady. Zapraszam bardzo serdecznie!
Przechodzimy do części praktycznej "równości" obiektów w Javie. Trzymamy się kolekcji "HashSet" i rzucam następującymi hasłami: "hashCode" w języku Java (zwany "kodem mieszającym") i "equals". Jesteście zaciekawieni znaczeń tych metod i w jaki sposób mogą pomóc nam przy ustalaniu czy dwa obiekty są sobie równe? Nie pozostaje Wam nic innego jak wchodzić do środka artykułu i czytać!
Następna porcja wiedzy na temat kolekcji w Javie. Wcześniej poruszyłem temat kolekcji "TreeSet", a teraz dowiemy się co nieco o bardzo podobnej kolekcji zwanej "HashSet" w języku Java. Przy okazji będzie wstęp do rozumienia "równości" obiektów. Zapraszam po szczegóły.
Jesteście zainteresowani jakie inne kolekcje występują w Javie? OK, zdecydowana większość problemów może zostać rozwiązana za pomocą "ArrayList", natomiast są też takie które okażą się o wiele skuteczniejsze albo chociaż zaoszczędzą trochę pisania ze względu na niektóre działania wykonywane automatycznie. A skoro o automatycznych działaniach mowa, to obejrzymy sobie kolekcję "TreeSet" w języku Java i porównamy sobie z poprzednim "książkowym" przykładem.
Zakończyłem jak na razie temat typów generycznych w Javie. Te tłumaczenia zastosowania typów ogólnych były potrzebne po to, abyśmy mogli teraz spokojnie wrócić do poprzedniego rozdziału na którym stanęliśmy. Możemy w końcu porównać sobie interfejs "Comparable" w języku Java do poprzedniego i zobaczyć jak daleko idą te różnice.
Javy nie ma końca. Kontynuujemy temat typów ogólnych. Poprzednio wspomniałem o słowie kluczowym "extends" w języku Java, które nie tylko jest wykorzystywane podczas dziedziczenia przez klasy, ale także przez typy generyczne. Poznajcie tajemnicę drugiego znaczenia "rozszerzania", bo przy programowaniu w Javie ma to dwojakie zastosowanie.
Przejdziemy teraz do drugiej części trudnego do przyswojenia tematu jakim są typy generyczne. Java posiada szerokie pole do popisu, jeśli chodzi o programowanie uogólnione, bo tak to się elegancko nazywa. Kolejnym krokiem w ich prawidłowym rozumieniu są metody generyczne w języku Java. Jak je tworzyć, jak je rozumieć a co najważniejsze, jakie dają korzyści. Wszyscy zainteresowani niech zaglądają do środka!
Wczoraj poruszyłem kwestią związaną z sortowaniem kolekcji. Nie możemy iść dalej z kontynuacją tego tematu bez podstawowego rozumienia typów generycznych. Typy generyczne w języku Java stanowią kręgosłup wszystkich wykorzystywanych kolekcji (i to nie tylko w tym języku!). Zrobię teraz do tego wstęp, aby artykuł jak każdy inny, spełniał swoją rolę jak najlepiej.
Czy już wiecie jak możemy posortować dowolną kolekcję w języku Java, która przyjmuje obiekty klasy niestandardowej? Mamy dwie drogi: interfejs "Comparator" lub interfejs "Comparable". Dzięki nim, jesteśmy w stanie ustalić kryterium w jaki sposób mają być sortowane obiekty, o czym pisałem w pierwszej części. Przyjrzymy się najpierw interfejsowi "Comparator" w języku Java.
Póki co, postanowiłem uznać serię artykułów na temat wątków w Java za zakończoną. Rzućmy teraz okiem na kolekcje. Co byście powiedzieli gdyby konieczne było sortowanie kolekcji w języku Java? Czy to znaczy, że trzeba w te pędy uczyć się algorytmów sortowania? Jest możliwość posortowania najbardziej powszechnie stosowanej kolekcji bez stosowania jakichkolwiek algorytmów czy skomplikowanych sztuczek (jak się później okaże, zależy jakiego typu są argumenty). Zapraszam do środka artykułu.
Dobra. Dotychczas temat wątków opierał się o same podstawowe zagadnienia. Uprzedzam, że od tej pory będziemy wchodzić w szczegóły, które mogą spowodować zrobienie sobie dłuższego "przystanku". Jak dobrze wiedzą ci, którzy czytali samą teorię, wątek w języku Java musi być opatrzony serią niezbędnych zabezpieczeń celem eliminacji wszelkich kolizji. Tematem na dziś będzie spójność danych, czyli jak sprawić żeby przy pomocy słowa kluczowego "synchronized" w języku Java, modyfikacja pewnej danej przez jeden wątek obowiązywała w innych obecnie działających wątkach. Język dysponuje pewnymi sposobami wdrażania takiego zabezpieczenia i dzisiaj poznamy jeden z nich.
Programując wątki w języku Java, każdy z Was bez wyjątku musi pojąć jedną bardzo ważną rzecz dotyczącą samego ich usypiania. OK, wiemy już, że za pomocą statycznej metody "sleep" klasy "Thread", możemy oddziaływać na przebieg działania wątku po prostu go opóźniając o podaną liczbę milisekund. Natomiast jest jeden niuans domagający się wyjaśnień. Uśpienie wątku w języku Java też coś przed nami ukrywa. Serdecznie zapraszam do środka artykułu.
Lecimy dalej naprzód z wątkami w Javie! Dzisiaj skonfrontujemy oba sposoby tworzenia wątków. Jest możliwość zrobienia tego od strony dziedziczenia klasy "Thread", ale mamy również do dyspozycji implementację interfejsu "Runnable" w języku Java. Którą drogę wybrać? Czy są jakieś różnice w działaniu? A może w efektywności? Przekonajcie się już teraz.
Oto przed Wami rozdział poświęcony wątkom w języku Java. Wczoraj opisałem dosyć rozlegle jak to wygląda teoretycznie. Programowanie współbieżne przeznaczone jest tylko dla nieco bardziej "kumatych" w tej dziedzinie i z pewnością amatorzy się w tym nie odnajdą. Dzisiaj uzupełnimy sobie tę wiedzę o drugą "połowę", czyli praktykę. Utworzymy sobie własny pierwszy nowy obiekt "Thread" w języku w Java, o którym będziecie słyszeć najczęściej w kontekście programowania wielowątkowego!
Zmęczeni już tą biblioteką "Swing"? Spokojnie, zmieniamy temat na całkiem inny i przejdziemy teraz do zagadnień związanych z połączeniem sieciowym. Java pozwala na łatwe tworzenie połączenia sieciowego na podstawie architektury klient-serwer. Przedstawiam Wam klasę "Socket" w języku Java - to od niej zaczyna się cała historia!
Przejdziemy teraz do zupełnie innego tematu dotyczącego Javy i zaprezentuję Wam jak utworzyć podstawowy warsztat dla odtworzenia pojedynczej nuty granej za pomocą interfejsu MIDI. Aby interfejs MIDI w języku Java dawał oczekiwane rezultaty, wymaga poznania i zrozumienia kilku następnych klas, które wspólnie przygotujemy i napiszemy. Zapraszam!
Czy wiecie jakie Java posiada możliwości obsługi dat i kalendarzy? Jedną z klas przeznaczonych do takich zadań jest "Date" w języku Java. Daty w Javie mogą podlegać operacjom arytmetycznym w stylu "odejmij 80 dni od bieżącej daty" otrzymując w ten sposób całkowicie poprawną kalkulację z uwzględnieniem dni przestępnych oraz regionu w jakim się aktualnie znajdujemy. Interesuje Was dalszy ciąg?
Poznamy teraz kolejny zapis dający wygodę przy wywoływaniu konkretnej metody danego obiektu dla każdego elementu przebywającego w tablicy / kolekcji. Gdzie tam zwykła pętla "for" czy nawet pętla rozszerzona. Nawet wyrażenie lambda ukazane całkiem niedawno można jeszcze bardziej skrócić. Niech Wam posłuży referencja do metody w języku Java!
Zerkniemy na temat związany z obsługą wyjątków w języku Java. To nie będzie kolejna pogadanka o wyjątkach, a tylko o pewnej metodzie wykorzystywanej nałogowo przez wiele osób w programach, filmach czy poradnikach. Widzicie to tyle razy. Za każdym razem gdy ktoś na szybko pisze blok "try-catch", zwykle osadza to samo wyrażenie po nazwie instancji klasy "Exception". Bez przerwy w przeważającej większości przypadków ludzie zalecą Wam to samo. W książkach wielkimi wołami również jest o tym wspomnienie, a jednak można nie zdawać sobie sprawy co ta metoda robi takiego ekscytującego, że wszyscy to stosują. Chodzi mi o "printStackTrace" w języku Java. Co to takiego? Zapraszam do środka.
Wznawiam temat serializacji danych w języku Java (radzę zobaczyć poprzednią część, jeśli nie wiecie o czym mowa). Wyobraźmy sobie taką sytuację. Mamy naszą klasę, implementujemy interfejs "Serializable" i każemy programowi zapisać wszystkie dane składowe...oprócz jednej! Takiej małej składowej, która powinna być pomijana ze względu na wartość unikalną dla konkretnego uruchomienia aplikacji. O Boże! Czy to znaczy, że z powodu takiej błahostki, serializacja obiektów idzie w drzazgi i trzeba od razu przerzucać cały system przechowywania do pliku tekstowego? Niekoniecznie! Twórcy języka i o takiej sytuacji pomyśleli więc mogę ją teraz zaprezentować. Poznajcie kolejne słowo kluczowe związane z wykluczaniem danych składowych do zapisu, "transient" w języku Java!
Przystępujemy do następnego artykułu po zapowiedzianej dłuższej przerwie. W nawiązaniu do klas wewnętrznych, teraz przystąpimy do bardziej nowoczesnego sformułowania. Ono istnieje od powstania Javy 8 więc o nim też mogliście już nieraz usłyszeć. Przedstawiam Państwu wyrażenie lambda w języku Java (ang. "lambda expression")! Pokażę na czym ono polega i dlaczego opłaca się go poznać.
Java pozwala na osadzanie jednej klasy w środku drugiej stając się klasą zagnieżdżoną (wewnętrzną). Taka klasa wewnętrzna w języku Java była często wykorzystywana przed wprowadzeniem wyrażeń lambda w Javie 8. Sięgnijmy do historii i zobaczmy do czego może się nam przydać "wklejanie" jednej klasy do drugiej!
Zaczynamy kolejną serię! Będę miał przyjemność pisać Wam na temat biblioteki "Swing" w języku Java, która pozwala na tworzenie graficznych interfejsów użytkownika. Zapraszam do artykułu, a dowiecie się jak utworzyć pierwsze okno graficzne!
Ostatni artykuł na dzisiaj (dotyczący Javy oczywiście) sięgać będzie tematu formatowania danych w postaci łańcuchów znaków, czyli typu "String". Nie chodzi tylko o konwertowanie liczb na łańcuchy, ale także ich ładne prezentowanie. Na przykład wypisanie dużej liczby z odstępami, czy też wyświetlenie wyników danej kolumny z tabelki o tej samej szerokości pola, aby kolejne dane się "nie rozjeżdżały". Prezentowany tutaj temat który nam to umożliwi to formatowanie danych w języku Java. Zapraszam już po raz ostatni w dniu Konstytucji 3 Maja!
Zabieram się za kolejną porcję obfitego redagowania na własnej stronie. Znowu Java bez zmian i opowiem czym jest import statyczny w języku Java oraz czym się on różni od zwykłego. To również stanowi jedynie element poboczny i może pomóc lub zaszkodzić w zależności od tego, kto czyta nasz kod. Nie migajcie się, poznajcie kolejny element o którym się mało mówi.
Jest jeszcze wczesna godzina, zatem macie kolejny materiał już po raz czwarty z rzędu TEGO SAMEGO DNIA! Nie wiem jak ja to znoszę i póki co, nie chcę się nad tym zastanawiać. Przechodzimy do kolejnego prostego tematu związanego z Javą, który macie traktować jako całkowicie opcjonalny. Dotyczy on statyczności, jest rzadko stosowany, a to coś w języku Java kryje się pod nazwą "inicjalizator statyczny". Poznajcie szerzej ten termin razem z przykładem pozostawionym w środku.
Gotowi na dalsze wyjaśnienia związane z tym samym artykułem? Został jeszcze jeden element. Pamiętacie dopisek "throws" w nagłówku metody? Jest to nieco rzadziej omawiany element a szkoda, bo równie przydatny co samo przechwytywanie wyjątków. Obsługa wyjątków to jedno, a "przerzucenie" tej odpowiedzialności na metodę wywołującą za pomocą słowa kluczowego "throws" w języku Java, to zupełnie inna bajeczka.
Godzina dwunasta, zatem piszę po raz drugi. Wracając do tamtego artykułu trzeba opisać kolejny obcy termin, na który wtedy zwróciłem Waszą uwagę. Serializacja obiektów w Javie wiąże się z dużą odpowiedzialnością. To nie jest temat, który powinien być w rękach kompletnej amatorszczyzny. Po czym rozpoznać doświadczonego od początkującego w tym temacie? Jeden wstawi ważną stałą "serialVersionUID" do klasy, a drugi nie. Wyjaśnienia czym jest "serialVersionUID" w języku Java zostawiam w środku.
Kolejna porcja Javy! Na pierwszy strzał idzie wyjaśnienie jednej z kilku nieścisłości, które pojawiły się w tym artykule. Pakiety tworzone za pomocą słowa "package" w języku Java są szeroko wykorzystywane, tylko nie każdy wie z jakich powodów. Może Wy jesteście zainteresowani dlaczego stosujemy pakiety i jakie są zasady ich wykorzystywania?
UWAGA!!!
Ze względu na stwarzanie problemów przez "Joomlę" z powodu korzystania z samego słowa "Java" pisanego małą literą, będę przez całość artykułu posługiwał się tą nazwą pisaną wielką literą. Przepraszam za utrudnienia, jednak to prawdopodobnie wynika z kolizji nazw i "Joomla" musi jakoś korzystać z tego słowa podczas przetwarzania treści artykułu.
Trzeci raz z rzędu piszę do Was tego samego dnia. Odejdźmy teraz od złożonych rzeczy i skupmy się na czymś prostszym. Taka pętla "foreach" w języku Java na przykład, która nazywana jest również "pętlą rozszerzoną". Debiut miał miejsce właśnie w Javie i pozwala na wygodniejszy sposób obsługi wszelkich tablic i list, czyli kontenerów przechowujących wiele danych w jednym miejscu. To będzie ostatni wpis na dzisiaj.
Zaprezentuję teraz drugi wariant zapisu i odczytu danych (poprzednim była serializacja). Język Java oferuje dodatkowo klasy zdolne do zapisywania danych w pliku tekstowym. Tutaj procedura jest zdecydowanie bardziej rozbudowana i uprzedzam, że może sprawiać duże trudności w rozumieniu, gdyż kod przeze mnie prezentowany będzie od razu zaopatrzony w metody, których mogliście jeszcze nie widzieć. Skoro już Państwa uprzedziłem, przechodzimy do rozpoczęcia tematu. Zapis i odczyt z pliku tekstowego w języku Java!
Na sam początek mam jedno pytanko. Czy ktoś z Was wie do czego służy serializacja obiektów w języku Java? Wiecie w ogóle że jest taki termin? Jeśli drapiecie się po głowie, to czytajcie uważnie. Nie mówię, że jest to podstawa w rozumieniu języka, natomiast przechowywanie danych w celu zapisu i odczytu może być ciekawym eksperymentem. To co, przekonałem do zmiany decyzji?
Niniejszy artykuł będzie robił za podsumowanie tego "sznurka" poprzednich wpisów na temat samego dziedziczenia w języku Java. Polimorfizm w języku Java to jeden z fundamentów programowania obiektowego, a w tym materiale skoncentrujemy się na pewnych przykładach, które będą bić polimorfizmem po oczach. W ten sposób zobaczycie jak bardzo potężną bronią dysponujecie!
Jesteście gotowi na kolejną część materiału o języku Java? Zaprezentuję Wam kolejne słowo kluczowe umożliwiające m.in. wywoływanie "pierwotnej" wersji przesłanianej metody. Jest nim "super" w języku Java. Ma to po części związek z wątkiem dziedziczenia, ale jaki konkretny to już zapraszam do środka!
Przystępujemy do następnej części z cyklu dziedziczenia w języku Java. Jak wiemy z poprzedniej części, abstrakcja pozwala nałożyć zabezpieczenie na tworzenie zbyt ogólnych obiektów i wymusić implementacje abstrakcyjnych metod na klasach potomnych. Teraz zapoznam Was z zabezpieczaniem od drugiej strony czyli sprawienie, aby dana klasa, metoda lub zmienna była "finalną". "final" w języku Java - oto czego Wam potrzeba!
Oto kolejny materiał dotyczący Javy jakim jest słowo kluczowe "abstract" w języku Java. Poprzednio wprowadziłem Was w dziedziczenie, a teraz zapoznacie się z kolejnym elementem, który bądź co bądź może wydawać się jedynie "dekoracją", aczkolwiek stanowi ważny wątek podnoszący elastyczność naszej aplikacji. Dowiecie się co to jest klasa i metoda abstrakcyjna, czym się one różnią od "zwykłych" odpowiedników oraz jaki to ma wpływ na przebieg pisania kodu.
Czas poruszyć wątek dziedziczenia! Jest to kolejny element stanowiący zakres podstawowego rozumienia języka Java. Dziedziczenie w języku Java to fundament w paradygmacie obiektowym. Na czym on polega? Jak on działa w programie? Jak go dostrzec w kodzie? Spokojnie, jedno zagadnienie po drugim zostanie tu wytłumaczone.
Dzień zaczyna dobiegać końca, a ja na zachętę przynoszę Wam następne akapity kręcące się wokół języka Java. Opiszemy sobie czym jest statyczność w języku Java. To jest jeden z tych tematów, który również jest często spotykany i wykorzystywany w praktyce. To brzmi na tyle poważnie, że postanowiłem zabrać się i za zmienne, i za metody statyczne. Nie uciekajcie od tego z krzykiem! To trzeba zrozumieć!
Zabieramy się znowu za język Java i za wątek przesłaniania, który opisałem wczoraj jeśli ominęliście. Kontynuacja poprzedniego wątku zaprezentuje jak można wykorzystać przesłanianie w stosunku do metody o nazwie "toString" w języku Java. Co to konkretnie jest?
Lecimy z następnym tematem Javy. Weźmiemy pod lupę dwa terminy, które wbrew pozorom nie są synonimiczne. Przeciążanie a przesłanianie w języku Java to pojęcia bardzo podobne do siebie, a oznaczają dwie zupełnie różne rzeczy. Macie przed sobą rozmowę kwalifikacyjną na stanowisko programisty w tym języku? Bądźcie gotowi na to, że to pytanie może paść!
Ucząc się języka Java należy być świadomym, że wiedza o samych metodach nie wystarczy. Trzeba sobie wytłumaczyć czym jest konstruktor w języku Java. Co to jest? Co on robi? Jak go zdefiniować i dlaczego jest tak ważny dla działania aplikacji? Na tym się dzisiaj skupimy.
Skaczemy ponownie do Javy i teraz pokażę Wam jak korzystać z mniej znanej struktury danych kryjącą się pod nazwą "HashMap" w języku Java. Użytkownicy Pythona raczej będą ją nazywali "słownikiem". Ja też wolę to stwierdzenie, natomiast ze względu na zachowanie tagów, będę korzystał naprzemiennie z obu tych nazw. Przejdźmy do wyjaśnienia jak w języku Java korzystać ze słownika.
Znowu artykuł i znowu Java. Dzisiejszym tematem jest przechwytywanie wyjątków w języku Java, dowiemy się co to takiego, jak działa i jak się zabezpieczyć przed niepożądanym działaniem w trakcie korzystania z "ryzykownej" metody za pomocą słów kluczowych "try", "catch" i "finally". Jeśli nałogowo korzystacie z języka Java, opanujcie to jak najprędzej, to jest jeden z tematów podstawowych.
Powracamy znowu do języka Java. Po raz pierwszy pragnę się wypowiedzieć na temat interfejsów i przykładów ich zastosowania. Aby nikt nie poczuł się zagubiony, artykuł ten będzie podzielony na dwie części: pierwsza będzie służyła wstępnemu tłumaczeniu czym jest interfejs i co ma z tym wspólnego słowo kluczowe "interface" w języku Java, a druga będzie obrazować przykład ich sensownego wykorzystywania. Opiszę Wam także jak można wykorzystać polimorfizm w stosunku do interfejsu i co nam to daje w efekcie końcowym.
Raz kolejny zwrócimy się w stronę Javy w celu przedstawienia bardzo przyjemnego i efektywnego zapisu. Umożliwia on zapisanie "rozciągliwej" metody, która będzie w stanie pobierać tyle parametrów ile tylko sobie zażyczycie. Jeden, pięć, nawet dwadzieścia. Taka implementacja jest możliwa jeżeli się wie o jej istnieniu i o sposobie zapisu. Pojęciem tym jest "zmienna liczba parametrów" w języku Java (ang. "variadic function"), sposób zapisu opisuję w środku.
Aby się mocno nie przemęczyć, teraz będzie lekki artykuł rozwiewający wątpliwości na temat Javy. Jak to z nią jest, Java jest kompilowana czy interpretowana? Czy może jedno i drugie? Jakby to Wam napisać, kompilacja w języku Java działa ona pół na pół. Kompiluje się do kodu pośredniego, aby go potem interpretować. Wyjaśnienia zostawiam w środku.
Sięgnę znowu do języka Java, aby jeszcze bardziej oddalić się choć na chwilę od tworzenia gier. Pisało się w nim dostatecznie dużo, żeby móc przedstawić Wam cechy języka Java, których każdy z Was powinien być świadom, jeszcze przed rozpoczęciem nauki. Nie będę zagłębiał się w szczegóły czy jakieś zaawansowane wątki, tu są tylko same konkrety.
Od 2019 roku Java stała się płatna w zakresie wykorzystywania komercyjnego, zatem wszyscy chętni zmuszeni są do wykupienia subskrypcji na określoną edycję. Jak to w życiu bywa, trzeba stale kombinować pod górę jednak można sprawić, aby dalej korzystać z języka za darmo i "na legalu". Na wszelki wypadek warto się zabezpieczyć, aby później uniknąć wszelkiego rodzaju nieprzyjemności. Tym sposobem jest pobranie "alternatywy" pod tytułem "Eclipse Adoptium". Nie muszę pisać, że przed poniższymi czynnościami, należy wpierw usunąć oficjalną Javę CAŁKOWICIE.