Výsledky vyhľadávania

pre ”java” sme našli 185 výsledkov

Články (16)

Všetky články
Novinky v Java 18
Vzdelávanie
06.12.2023
Tím Skillmea

Novinky v Java 18

V tomto článku sa pozrieme na zmeny, ktoré priniesla Java 18. Kódovanie textovV prvom rade sa zmenilo základné nastavenie kódovania. Ak si doteraz pracoval na Windowse a vytváral si súbor napríklad cez FileWriter tak kódovanie textu bolo uložené vo formáte Windows-1252. Ak si vytváral súbor na Linuxe alebo Macu tak dáta boli uložené vo formáte UTF-8. Teraz aj keď si na Windowse, tak základné kódovanie je nastavené na UTF-8. Jedoduchý web serverJava 18 predstavila príkaz jwebserver v príkazovom riadku. Tento príkaz spustí minimalistický webový server pre jednoduché testovanie. Tento server sa dá vytvoriť aj programovo použitím metódy SimpleFileServer.createFileServer. Pattern matching v switchVo verzii 18 je stále v preview fáze. Táto funkcia umožňuje použiť switch flexibilnejšie, najmä s prácou s typmi v case príkaze. Tu sú ďalšie príklady na ilustráciu: Switch nad, ktorý pracuje s rôznymi typmi objektov: switch (obj) { case Integer i -> System.out.println("Integer: " + i); case String s -> System.out.println("String: " + s); case null -> System.out.println("It's null!"); default -> System.out.println("Unknown type"); } Switch, ktorý pracuje s objektami a s takzvanými guards, čo sú ďalšie logické požiadavky: switch (obj) { case String s && s.length() > 5 -> System.out.println("Long string: " + s); case String s -> System.out.println("Short string: " + s); case Integer i && i > 10 -> System.out.println("Large integer: " + i); default -> System.out.println("Other"); }  V tomto príklade riadok, ktorý sleduje, či je dĺžka stringu väčšia ako 5 dominuje nad druhým casom, ktorý rieši len či je s String.  Ak by som ich vymenil switch (obj) { case String s -> System.out.println("Short string: " + s); case String s && s.length() > 5 -> System.out.println("Long string: " + s); case Integer i && i > 10 -> System.out.println("Large integer: " + i); default -> System.out.println("Other"); } tak druhý riadok by bol chybový a hláška znie: Label is dominated by a preceding case label 'String s' Switch, ktorý pracuje so sealed triedami: sealed interface Shape permits Circle, Rectangle {} final class Circle implements Shape { } final class Rectangle implements Shape { } A switch, ktorý môže pracovať so špecifickými subtypmi triedy Shape: Shape shape = new Circle(); switch (shape) { case Circle c -> System.out.println("It's a circle"); case Rectangle r -> System.out.println("It's a rectangle"); }
Java 8
Tipy a triky
19.09.2018
Skillmea

Java 8

Java 8 je veľký balíček novej funkcionality oproti Java 9 a java 10. Tie sú menšie a odzrkadľujú taktiku tvorcov javy vydávať nové verzie častejšie s menším balíkom novej funkcionality. V tomto článku si povieme najvýraznejšie zmeny z Java 8. Funkcionálne rozhraniaRozhranie, ktoré má len jednu abstraktnú metódu je považované za funkcionálne rozhranie. Pre lepšie načrtnutie v kóde môžeme a je odporúčané pridať anotáciu @FunctionalInterface.  import java.lang.FunctionalInterface;   @FunctionalInterface public interface FunctionalInterfaceExample {     void print(); }  Lambda výrazyOk, chceme pridať do javy možnosť definovať funkcionalitu bez toho aby patrila špecificky pod nejakú triedu. Tieto funkcie chceme vkladať do metód ako parametre. Čo spravíme? Tvorcovia javy sa asi takto nezamýšľali, ale my sme sa takto zamysleli a odpoveď je – použijeme lambda výrazy.  Každá lambda má ako typ funkcionálne rozhranie s jej odpovedajúcou metódou. V príklade vyššie máme rozhranie s metódou print. Táto metóda nevracia nič a neprijíma žiadne parametre. Musíme vytvoriť aj taký lambda výraz – teda nebude obsahovať return a nebudeme mať žiadne návratové hodnoty.  () -> System.out.println("Hello Word")Takto vložíš lambda výraz do metódy:  printHelloWord(() -> System.out.println("Hello Word"));Samotná metóda prijíma na vstupe práve dané funkcionálne rozhranie:  public void printHelloWord2(FunctionalInterfaceExample printHello)Viac o lambda výrazoch sa dozvieš z môjho online kurzu Java pre pokročilých, videá o lambda výrazoch sú zadarmo. StreamsStreamy poskytujú zjednodušenú prácu s dátovými kolekciami. Poskytujú viacero užitočných metód ako sú napríklad filter, sorted, map a iné. Ak stream préjde cez všetky elementy v kolekcii, tak bude prázdny. Teda ak chcem znovu použiť ten istý stream, tak zbytočne, lebo tam už nebudú dáta. Musíš si vytvoriť nový stream.  Nový stream vytvoríš napríklad pomocou stream metódy nad kolekciami.  List<Osoba> osoby = Arrays.asList( null, new Osoba("Jaro", "Beno", 30), new Osoba("Peter", "Kridlo", 55), new Osoba("Karol", "Otko", 18), new Osoba("Karol", "Beno", 18), new Osoba("Peter", "Otko", 20), new Osoba("Fedor", "Ronald", 84) ); osoby.stream();Máš zoznam osôb a chceš z daného zoznamu získať všetky veky osôb starších ako 50 rokov a majú byť zoradené podľa veku. Čo spravíš? Použiješ stream a jeho metódy – tieto metódy akceptujú funkcionálne rozhrania, teda tam dáš lambda výrazy.  List<Integer> veky = osoby.stream() .filter(osoba -> osoba.getVek() < 50) .sorted(Comparator.comparing(Osoba::getVek)) .map(Osoba::getVek) .collect(Collectors.toList());Kolekcie, ktoré sú iterovateľné, majú metódu forEach – ktorá získa stream a prejde všetky elementy.  veky.forEach(System.out::println);   Method referencePo slovensky referencia na metódu. Všimni si príklad z hora: Osoba::getVek. Znamená to, že z triedy Osoba použi metódu getVek. To isté sa dá zapísať aj pomocou lambda výrazu takto osoba -> osoba.getVek(). Ale pomocou referencie si to zjednodušíme lebo java vie, aký je vstupný parameter – je to osoba a vie, že voláš getVek. Tak stačí napísať Osoba::getVek. Metódu voláš bez zátvoriek.  Ďalší článok o Jave už čoskor. Prihlás sa k odberu noviniek a nezmeškaj žiadný nový blog.   
JavaScript developer Adam odporúča študovať online
Success stories
20.04.2017
Martina Baumann

JavaScript developer Adam odporúča študovať online

Stretli sme sa na našom prvom meetupe. Adam Ilčišák síce nie je veľký fanúšik networkingových akcií, ale pokecať s nami si prišiel rád. A my sme sa s ním porozprávali, vymenili si skúsenosti a niečo z toho teraz prinášame aj vám. Čítajte v nasledujúcich riadkoch. Na začiatok začnime tvojou prácou. Čo presne robíš, aká je tvoja pozícia?   Som junior JavaScript developer v spoločnosti Accenture. Som tam ešte len tri mesiace, čiže zatiaľ som toho veľa nestihol, ale som na internom projekte, kde vyvíjame aplikáciu vo frameworku Angular 2. A ako si k tomuto vôbec dostal? Čo ťa k tomu viedlo?  Tak, vyštudoval som politológiu. Vždy som mal ale v hlave nejaké svoje business projekty a vždy k tomu bolo treba nejakú appku alebo aspoň web. Tak som sa zháňal po nejakých programátoroch, ale zistil som, že také služby sú dosť drahé. Povedal som si teda, že sa naučím spraviť si web sám. A tak som popri inej práci intenzívne študoval a kódil. Nevytvoril som síce ešte nič, čo by bolo reálne použité, ale chytilo ma to tak, že som si povedal, že kým sa mi nepodarí rozbehnúť niečo svoje, tak toto chcem robiť. Máš nejaký vzor, ktorý ťa inšpiruje? Osobu, ktorá je pre teba motivátorom?  Nemám konkrétnu osobu, ktorá by má inšpirovala, ale mám rád príbehy úspešných ľudí. Myslím, že z každého si môže človek niečo vziať. Kde berieš inšpiráciu pre svoju prácu? Máš nejaké tipy, ktoré zaručene fungujú?  V korporácií tej motivácie zas toľko nepotrebujem. Kódim, čo mi povedia že mám nakódiť :) V tejto oblasti je potrebné sledovať aktuálne trendy, inovácie. Ako si na tom ty? Stíhaš to všetko popri práci?  Ani neviem, či sa to všetko dá reálne stíhať. Som veľmi rád, že dnes sa už programovaniu venujem na full-time a je určite ľahšie sledovať trendy, pretože s tým robím na dennej báze. Popri bývalej práci som to ale vôbec nestíhal a aj teraz mám pocit, že sa to všetko mení veľmi rýchlo. Mám taký hrubý prehľad, ale detailne sa zameriavam iba na to, s čím aktuálne robím - momentálne teda na frontend a Angular. Čo ťa najviac baví na tvojej práci? Máš nejaký obľúbený task, ktorý robíš najradšej?  Najviac sa mi páči, že sa učím veľa praktických veci, ktoré sa dajú reálne použiť aj na vlastné projekty. Zároveň ma práca ako taká veľmi baví, pretože jej výsledkom je reálny produkt. Dnes je obrovský dopyt po programátoroch. Čo by si poradil všetkým, ktorí nemajú žiadne skúsenosti, ale chceli by nejako začať?  Poradil by som, aby sa vykašľali na knihy. Ja knihy milujem a je to taký starý zvyk, či model, že keď sa chce človek niečo naučiť, tak potrebuje mať knihy a v nich niečo študovať. Pri programovaní to však podľa mňa neplatí. Ja som začal s knižkou a trápil som sa s notepadom a prepisovaním kódu. Knižka bola stará dva roky, ale pri programovaní sa za dva roky zmení dosť veľa vecí. Online je obrovská komunita ľudí, ktorí radi pomôžu, online nájde človek vždy najnovšie informácie a diskusie k rôznym problémom, tiež množstvo študijných materiálov a videí. IT je všeobecne vnímané ako veľmi špecifická oblasť. Aký je tvoj názor?  Nemyslím si, že je to zase tak špecifická oblasť - v súčasnosti si skôr myslím, že je to už niečo úplne bežné. Mal si niekedy pocit, že to nezvládneš? Bolo obdobie, kedy si chcel skončiť a robiť niečo úplne iné?  Zatiaľ nie. Občas mám pocit, že sa toho musím ešte strašne veľa naučiť a že je predo mnou dlhá cesta, kým budem patriť medzi špičku, ale som pripravený na sebe makať.    Cítiš na Slovensku silnú konkurenciu v tom, čo robíš konkrétne ty? Musíš mať „ostré lakte“?  Zatiaľ nemôžem povedať, že by som cítil silnú konkurenciu. Som začiatočník a s veľmi obmedzenými schopnosťami a vedomosťami som si našiel prácu v tomto odvetví. Takže skôr by som povedal, že cítim dopyt po pracovnej sile.  Aké sú tvoje plány do budúcnosti?  To je tajné.[Image] Vďaka za rozhovor Adam. Páčil sa ti rozhovor? Venuj mu 👍  Ak máš na Adama nejakú otázku, napíš ju dole do komentára 👇  
Java persistence – JPA, Hibernate, ORM
Tipy a triky
05.02.2019
Skillmea

Java persistence – JPA, Hibernate, ORM

JPA je java persistence api špecifikácia. Na to, aby si mohol používať JPA v skutočnej aplikácii, potrebuješ implementáciu JPA. Buď použiješ servery, ktoré už ponúkajú implementáciu JPA, ako napríklad GlassFish, alebo použiješ implementáciu, ktorú ti poskytuje framework Hibernate alebo EclipseLink. Ak používame JPA štandardy, tak je v budúcnosti úplne jedno, akú implementáciu JPA budeme používať. Pri programovaní budeme používať JPA anotácie, ktoré pochádzajú z balíka javax.persistence. V budúcnosti môžeš nasadiť aplikáciu na GlassFish, ktorý pozná javax.persistence a vie s tým pracovať alebo na Tomcat s použitím Hibernate, ktorý tiež pozná javax.persistence a vie s tým pracovať.  Čo je Persistence?Ak vytvoríš hocijaký jednoduchý objekt, čo sa stane? Napríklad objekt Adresa? Vytvorí sa v halde – v pamäti. Objekt môže mať nasetované nejaké dáta – informácie. Ak sa ale stratí referencia v javovskom kóde na tento objekt v halde – tak sa zmaže.  Ak si chceme uchovať tieto informácie, tak ich môžeme uložiť do databázy a najlepšie, aby po vytiahnutí z databázy mali tieto dáta tú istú formu – teda formu objektu Adresa.  Tomuto sa hovorí, že persistujeme (uchováme stálosť) objekt do databázy. Akoby tento objekt existoval aj mimo java programu. Tento objekt sa uchová v úložisku a znovu sa vytvorí, ak bude treba.  Čo je ORM?Klasické databázy ako Oracle, MySql a podobne sú relačné databázy, ktoré majú dáta uložené vo forme tabuliek. V jave ukladáme dáta vo forme objektov, v databáze vo forme tabuliek. Ale čo majú podobné? V relačnej databáze máme stĺpce, ktoré majú názvy a v riadkoch máme hodnoty. Niečo ako klúč hodnota – to isté platí aj pre objekty v jave – tam máme názov premennej a hodnotu v nej uloženú.  Tu prichádza pod ruku ORM – teda object relational mapping. Je to niečo ako objektovo relačné mapovanie. My naše java objekty namapujeme na tabuľky relačnej databázy. Aby sme vedeli, že tento field v javovskom objekte patrí do tohto stĺpca.   Objekty v jave sú medzi sebou prepojené pomocou uloženia referencie na daný objekt. Napríklad človek má field Adresa, kde je uložená referencia na objekt Adresa.  Relačné tabuľky majú medzi sebou tiež väzby. Buď máme v tabuľke pre človeka stĺpec adresa, kde bude uložený identifikátor adresy a na základe tohto identifikátora nájdeme danú adresu. Alebo existuje špeciálna tabuľka, kde budú dva stĺpce jeden pre identifikátor adresy a druhý pre identifikátor človeka. My potom vieme nájsť, aké adresy má človek nastavené, alebo pre akého človeka je nastavená daná adresa.[Image] Problém s JDBC prístupom – výhoda ORMV kurze Java pre pokročilých, ak si tento kurz videl, sme si ukazovali prístup k databáze cez JDBC. Čo sme spravili? Otvorili sme konekciu na databázu, napísali sme sql príkaz, ktorý sme následne poslali do databázy na vykonanie. Databáza nám vrátila výsledok vo forme result setu.  Predstav si, že máš len 5 až 10 tabuliek. Nad každou tabuľkou máš napríklad 4 rôzne sql príkazy – to máme približne 20 – 40 sql príkazov. Ak sa ti stane, že musíš zmeniť databázu – napríklad zmeníš názov stĺpca v tabuľke? Čo musíš spraviť? Musíš prepísať názov tohto stĺpcu na xy miestach – na 20 až 40 miestach – a to sme len v malej aplikácii – čo ak by to bolo na 100 miestach?.  Bol by v tom neporiadok a mohli by nastať problémy.  Ak ale použijeme ORM, tak v jave pracujeme s naším kódom, tak ako bežne. Vytvoríme si objekty typu Clovek, nastavíme mu nejaké hodnoty. Ďalej si vytvoríme kolekciu Adries pre daného človeka. Nakoniec v ORM frameworku povieme len persistni mi tento objekt. ORM sa potom postará o všetko uloženie týchto objektov do databázy na základe mapovania, ktoré mu poskytneme.  Clovek clovek = new Clovek(); clovek.setMeno("Jaro"); clovek.setPriezvisko("Beno"); Adresa adresa1 = new Adresa(); adresa1.setUlica("Nejaka 5"); adresa1.setPSC("94404"); Adresa adresa2 = new Adresa(); adresa2 = new Adresa(); adresa2.setUlica("Nejaka 5"); adresa2.setPSC("94404"); List<Adresa> adresaList = Arrays.asList(adresa1, adresa2); clovek.setAdresaList(adresaList); orm.persist(clovek); Ak by sme nepoužili ORM, sami by sme museli napísať metódu, ktorá nám otvorí konekciu na databázu, museli by sme napísať INSERT SQL príkaz pre človeka a potom aj pre jeho adresy a museli by sme zabezpečiť, aby sme nastavili všade dáta tam kde majú byť a musíme sa postarať aj o prepojenia medzi týmito dvoma objektami.  Ak ale použijeme ORM, tak sa nemusíme starať o tento balast kódu, ale sústrediť sa najmä na to, čo predáva a to je business logika aplikácie.  Nevýhody JDBC prístupu sú teda, že máme príliš veľa SQL príkazov, veľmi veľa kópie kódu, ručne sa musíme postarať o nastavenie dát do správnych stĺpcov.  Výhodou ORM je, že nemusíme robiť tieto veci z predchádzajúcej vety. ORM nám umožní používať java objekty na reprezentáciu relačnej databázy. ORM sa nám postará aj o prepojenie závislostí. ORM spojí výhody relačnej databázy a objektového modelu v jave plus schová všetku komplexitu SQL príkazov.  Čo je Hibernate? Hibernate je ORM – object relational mapping framework, ktorý slúži na mapovanie java objektov na tabuľky relačných databáz.  Java programátori sú zvyknutí písať kód v objektoch, prečo teda potrebujú ďalší jazyk – sql – na získanie dát z databázy? Hibernate na pozadí sám vytvára sql príkazy nad databázou a preto nemusíme písať sql príkazy my.  Ak chceme uložiť mapu objektov, napríklad Cloveka, ktorý ma Adresu, alebo aj viac objektov typu Adries, tak nemusíme písať všetky sql príkazy. Stačí, ak zavoláme jednoduchú metódu na uloženie objektu do databázy a hibernate sa postará o zvyšok.  Hibernate je aj implementácia JPA. [Image] Čo je JPA?Skratka JPA je Java Persistence API. Čo to znamená? V jednoduchosti povedané – je to štandard. Trošku zložitejšie povedané – je to špecifikácia pre OR mapovanie a je súčasťou Java EE, ale môžeme ju používať aj v Java SE projektoch.  Niektoré servery poskytujú vlastnú implementáciu JPA a niektoré nie – v tom prípade použijeme napríklad Hibernate implementáciu.  Predstav si, že celý tvoj kód používa veci z JPA. Teraz je na tebe, kam nasadíš svoju aplikáciu. Ak ju nasadíš na Glassfish nemusíš prerábať svoj kód, ktorý používa JPA – Glassfish ho pozná. Ak svoju aplikáciu nasadíš na Tomcat, tak mu prihodíš Hibernate, ktorý tiež pozná JPA. Potom tvoj kód bude fungovať všade – lebo používa štandardy JPA.  Je možné aby sme používali len Hibernate – teda by sme nepoužívali nič zo štandardov. Žiadne anotácie z javax.persistence a podobne – to ale neodporúčam.  Pýtal som saNapadlo mi, že by nebolo od veci spýtať sa kolegov developerov, čo si myslia o JPA a Hibernate. Ak by si si chcel prečítať ich názory, nech sa páči – bez cenzúry, citujem:  Tak toto je náročná téma a navyše zložitá.  JPA resp. ORM všeobecne (a teda aj Hibernate) sú vždy zložitejšie, než si používatelia (t.j. vývojári) uvedomujú. Výsledkom sú často nenápadné chybičky, lazy load exceptions, ktoré vedú k anti-patternom ako je OSIV (open session in view) alebo k výkonovým problémom (n+1 problem).  Týchto problémov je typicky o to viacej, o čo zložitejšie je mapovanie – a pritom práve na riešenie zložitého mapovania bolo ORM vymyslené. Aby sme mohli namapovať doménu do DB. Na to, sa často používajú aj “mimojazykové” triky ako reflection na private polia, takže objekty sú implicitne zviazané s ORM riešením, aj keď napr. mapovanie je oddelené do XML namiesto anotácii, čo samo o sebe je tiež nepraktické.  Okrem toho majú obe hlavne implementácie dosť bugov na to, aby na ne človek narazil, aj keď postupuje v súlade so špecifikáciou – stačí len chcieť trosku viacej a na nejaký bug určite narazíte. Takže potom to je kľučkovanie medzi bugmi a často komplikovaná možnosť vymeniť ORM providera.  Čo sa mi na ORM páči je lepšie mapovanie typov, možnosť customizovať mapovanie a podobne. Preto používam JPA aj na jednoduché mapovačky namiesto JDBC.  Navyše s JPA používam rad Querydsl, ktoré je lepšie/intuitívnejšie, než JPA štandardné Criteria API.  Hibernate používam dlho ale pravdu povediac nikdy som sa veľmi nezamýšľal nad výhodami. Zatiaľ som nemal výraznejší problém, ktorý by som nevedel vyriešiť, prípadne nejako obísť.  Plusy:  - ľahko sa robí mapovanie do DB s anotáciami aj pre začiatočníka bez veľkých znalostí databázy, zároveň ale bez znalosti DB môže byť mapovanie neefektívne  - je open source, takže ak potrebujem, viem pozrieť zdrojáky ako funguje  Mínus:  - asociácia OneToOne fetch=lazy nefunguje  Na používaní Hibernate/JPA (celkovo ORM vrstve) sa mi páči:  A) Abstrakcia od fyzického dátového modelu. Vývoj nad doménovým/logickým (entitno-relačným dátovým modelom) - bližšie k biznis vrstve. Čiže zjednodušené práca s objektami namiesto tabuliek.  B) Možnosť využívať rôzne pokročilejšie techniky získavania dát (napr. Spring Data JPA, ale aj zjednodušujúce Hibernate Query by example)  C) Agnostické od konkrétnej databázovej technológie (Oracle, MySql, ...)  D) Cachovanie a optimalizácia (napr. lazy loading)     Nevýhody:  A) Niekedy náročný (až nemožný) performance tuning.  B) Pri niektorých technológiách pomalšia krivka učenia.  C) Aj napriek používaniu JPA/Hibernate, je takmer nevyhnutné, aby developer poznal aj (native) SQL jazyk a jeho použitie.  ZáverPodarilo sa ti nazrieť do problematiky objektovo relačného prístupu k databáze a pochopil si, čo to znamená. Ak sa však chceš dostať ešte o level ďalej, pripravili sme pre teba samostatný kurz Java persistence – JPA a Hibernate. Ak chceš ešte viac, tak klikaj:👍 Viac o mne: http://www.jaroslavbeno.sk/  👍 Kurzy (java, git, maven, bootstrap, Asp .Net,): Learn2Code moje kurzy 👍 Free kurzy: YouTube kanál JaroslavBeno
Java najnovšie verzie – Java 9 moduly (1. časť)
Vzdelávanie
09.12.2018
Skillmea

Java najnovšie verzie – Java 9 moduly (1. časť)

Od verzie 9 bude java vychádzať v pravidelných intervaloch. Každých 6 mesiacov nová java. Takže môžeme očakávať nové funkcionality častejšie, ale v menších dávkach. Najpoužívanejšia Java v súčasnosti je java 8 – vyšla v roku 2014. Java 9 prvýkrát vyšla v septembri 2017, neskôr boli opravené kritické chyby a dalo by sa povedať, že taká lepšia verzia vyšla v januári 2018. Java 10 vyšla v marci 2018, Java 11 v septembri 2018. Takže rýchly posun vo verziách, ale nie drastický posun vo funkcionalite.  Čo je lepšie? Naraz a veľa alebo menej a postupne? Záleží od toho, čo robíš. Ak používaš veľa frameworkov a knižníc tretích strán, tvoja práca po zvýšení javy môže byť ovplyvnená.  Prvým míľnikom je java 11, ktorá je označená ako LTS, teda long term support. Táto verzia javy bude dlhodobo opravovaná a bude o ňu postarané na najbližšie roky. Čo to znamená? Že je pravdepodobnejšie, že firmy poskočia z javy 8 skôr na javu 11, lebo budú mať istotu, že táto java bude v budúcnosti opravovaná – ak by sa našla nejaká kritická chyba.  V tomto článku sa zameriame hlavne na výpis zmien, čo je nové. Nebudeme sa zaoberať jednotlivými zmenami podrobne. To si necháme do budúcna.  InštaláciaNajprv si musíš stiahnuť a nainštalovať najnovšiu javu jdk. V čase písania článku je to Java 11. Nastav si premennú prostredia JAVA_HOME na novú javu – na root, nie na bin priečinok. Potom do PATH premennej nastav cestu práve na bin priečinok novo nainštalovanej javy.  Spusti príkazový riadok a zadaj príkaz: java – version  Ak sa ti objavila verzia, všetko je v poriadku. [Image] Ak je nejaká chyba, alebo ukazuje staršiu verziu, tak sa uisti, že v PATH je cesta bin novej javy nastavený na začiatku. Je možné, že v PATH máš nastavené aj C:\ProgramData\Oracle\Java\javapath. Ak áno, tak to musí byť až za cestou na najnovšiu javu.  ModulyV jave 9 je najskloňovanejšia zmena projekt Jigsaw – ale stačí, ak si zapamätáme, že ide o modularitu – rozdelenie veľkého monolitu – teda celá aplikácia v jednom balíčku na menšie celky – moduly. Moduly potom povedia, čo zverejňujú do sveta a čo požadujú pre svoju správnu funkcionalitu.  Každý modul obsahuje module-info.java súbor a aspoň jeden balík. Modul-info.java v sebe obsahuje popis závislostí, ktoré modul potrebuje. Každý modul je nezávislý v ponímaní, že ak obsahuje obrázky, alebo konfiguračné súbory, tak modul si ich manažuje sám. Všetko, čo je v module je privátne pre modul, ak nepovieme inak.  Existujú 4 typy modulov. System moduly – Java SE a JDK moduly – ak si všimneš, tak v nainštalovanom jdk pre novšiu javu chýba priečinok jre. Teraz tam je jmods. Tu máme umiestnené všetky už default poskytované moduly. [Image] Aplikačné moduly sú moduly, ktoré chceme vytvárať, keď sa rozhodneme, že chceme používať moduly.  Automatické moduly sa vytvoria, keď pridávame JAR súbory na path modulu. Názov modulu sa preberie z názvu jar súboru. Tieto automatické moduly majú plný prístup na čítanie do všetkých ostatných modulov načítaných na path.  Nepomenovaný modul = ak sa na path – nie na module path – načítajú nejaké triedy alebo jar súbory, tak tieto triedy a jar súbory sú automaticky pridané do tohto nepomenovaného modulu. Slúži na spätnú kompatibilitu s predchádzajúcim starším javovským kódom.  DistribúciaModul má byť zbalený ako jar súbor – jeden jar súbor má obsahovať max jeden modul. Keď robíme build projektu, musíme si dať pozor, aby sme zabalili každý modul v našom projekte ako samostatný jar.  Základné modulyVraveli sme si, že jdk má novú štruktúru, ktorá má v sebe jmodules. Tu sú základné moduly. Tieto moduly si vieme vypísať pomocou príkazového riadku ak zadáme príkaz <b>java --list-modules</b>. [Image] Každý modul, ktorý vytvoríme, bude používať implicitne java.base modul. Použitie iných modulov bude dostupné po konfigurácii.  Vytvorenie moduluModul v podstate vznikne, ak zadefinujeme v roote zdrojového kódu modulu súbor module-info.java.  Týmto momentom sa pracuje so zdrojovým kódom ako s modulom. Moduly sa navzájom nevidia – nemajú prístup jeden do druhého a do tretieho a tak ďalej. Podľa toho koľko modulov používame.  Ak chceš používať niečo z vonku, alebo chceš, aby vnútro tvojho modulu, alebo čas vnútra tvojho modulu bolo viditeľné, musíš to zadefinovať.  Majme projekt, do ktorého si zadefinujeme nový modul. V module máme src priečinok, do ktorého budeme dávať všetok zdrojový kód. Vo vnútri si zadefinujeme balíček sk.jaro.demo a v ňom ešte external a internal. Vytvoríme si jednoduché triedy, ktoré len niečo vypíšu na konzolu. [Image] package sk.jaro.demo.external; public class HelloMainModuleExternal { public void doAction() { System.out.println ("Hello main module HelloMainModuleExternal"); } }package sk.jaro.demo.internal; public class HelloMainModuleInternal { public void doAction() { System.out.println("Hello main module HelloMainModuleInternal"); } }Tieto triedy sú odlišné len v názve a výpise na konzolu. Internal si neskôr nastavíme, aby bola viditeľná len v module main. External si neskôr nastavíme, aby bola viditeľná aj mimo modulu main. V src tohto modulu si vytvor súbor module-info.java. Vnútro súboru má syntax, kde je najprv kľúčové slovo modul, potom názov modulu – vieš používať aj bodky a potom sú kučeravé zátvorky: modul nazovmodulu{ }. Chceme, aby balíček external bol dostupný aj pre iné moduly – musíme nastaviť aby sa exportoval. module main { exports sk.jaro.demo.external; }Teraz si vytvoríme nový modul v tom istom projekte s názvom utils. Vo vnútri budeme mať jednu triedu, v ktorej sa budeme snažiť použiť HelloMainModuleExternal triedu z modulu main. [Image] Module-info.java musí teraz obsahovať, že v tomto module vyžadujeme modul main – pretože používame funkcionalitu z tohto modulu.  module utils { requires main; }Teraz môžeme použiť triedy, ktoré boli exportnuté z main modulu:  package sk.jaro.demo; import sk.jaro.demo.external.HelloMainModuleExternal; public class UseSomethingFromMainModule { public static void main(String[] args) { HelloMainModuleExternal helloMainModuleExternal = new HelloMainModuleExternal(); helloMainModuleExternal.doAction(); } }ZáverNa záver by si sa mohol teraz s tým kúsok pohrať. Skús použiť triedu, ktorá nie je exportnutá z modulu main.  O moduloch by sa dalo písať a hovoriť viac, ale dúfam, že si porozumel princípu modularizácie. Mne v priebehu študovania tejto témy vybehlo pár otázok, na ktoré som si ešte neodpovedal. Napríklad: Maven s java modularizáciou? Frameworky a modularizácia?  Ak sa ti článok páčil, tak napíš niečo do komentárov, poteší ma to.  Zaujímaš sa o Javu? Skús jeden z kurzov na túto tému na https://skillmea.sk.  Ak sa chceš o mne dozvedieť viacej sleduj môj web www.jaroslavbeno.sk.  Jaro Zdrojové kódy na stiahnutie.
Java 10 a 11 – vybrané programátorské zmeny
Tipy a triky
22.05.2019
Skillmea

Java 10 a 11 – vybrané programátorské zmeny

Zaujíma ťa, aké zmeny sa udiali v Java 10 a 11? Čítaj článok a všetko podstatné sa dozvieš. Java 10Var Od verzie 10 je dostupná možnosť nešpecifikovať typy premenných pre lokálne premenné, ak ich vie kompilátor zistiť z pravej strany. Namiesto napísania typu stačí napísať nešpecifikovaný typ a to var. var list = new ArrayList<String>(); Kompilátor vie zistiť, akého typu je list a teda nie je možné pridávať čísla do listu, ale iba String. var list = new ArrayList<String>(); list.add("Jaro");Var sa neberie ako kľúčové slovo, ale ako nešpecifikovaný typ. Teda nemôžeme vytvoriť triedy s názvom var, ale je možné vytvoriť metódu s názvom var. //error String return(){ return ""; } //ok String var(){ return ""; }Nová metóda na kolekciách Pri kolekciách pribudla metóda copyOf, ktorá skopíruje jednu kolekciu do druhej. List<String> list = List.of("Jaro", "Fero", "Duro"); Set<String> set = Set.copyOf(list); List<String> listCopy = List.copyOf(set); Map<Integer,String> map = Map.of(1,"Jaro",2,"Fero"); Map<Integer,String> map2 = Map.copyOf(map);Java 11Var v lambda výrazoch Lambda výrazy podporujú type inferenciu, čo znamená, že ak používaš premennú v lambda výraze, tak java kompilátor vie zistiť, akého je typu a nemusíme typ zadefinovať. list.stream() .map(s -> s.toLowerCase()+".") .collect(Collectors.toList());V predchádzajúcich verziách javy sme nedokázali písať anotácie k premenným vo vnútri lambda výrazu, ktoré nemali zadefinovaný typ. Od verzie 11 je to možné, skoro – nemusíme zadefinovať špecifický typ, stačí ak napíšeme var. list = list.stream() .map((@Notnull var s) -> s.toLowerCase()+".") .collect(Collectors.toList());Jednoduchšie spustenie programuAk si napíšeš jednoduchý program a chceš ho spustiť v konzole, tak ho musíš najprv skompilovať cez príkaz javac a potom spustiť cez príkaz java.  Teraz stačí, keď rovno spustíš .java súbor pomocou java príkazu. Stane sa to, že sa automaticky súbor skompiluje a spustí.  java Main.java  java.lang.String metódyV triede String pribudli nové metódy.  isBlank() – vracia true, pokiaľ je reťazec prázdny alebo obsahuje len biele znaky  lines() – zo Stringu sa vráti stream riadkov – ak stream obsahuje oddeľovače riadkov  java.util.function.Predicate not Predstavme si takýto kód: lines.stream() .filter(s -> !s.isBlank())Pomocou Predicate.not vyzerá krajšie a čitateľnejšie: list.stream() .filter(Predicate.not(s -> s.isBlank()));S výhodou použitia method referencie:  list.stream() .filter(Predicate.not(String::isBlank));Ak použijeme statický import: list.stream() .filter(not(String::isBlank));Ak ťa zaujal článok a chcel by si sa dozvedieť viac, tak klikni na moju stránku a presuň sa na to, čo ťa zaujíma. Programovanie, kurzy, videá zdarma a iné záležitosti. Klikaj na www.jaroslavbeno.sk
Novinky v Java 15
Vzdelávanie
14.04.2023
Skillmea

Novinky v Java 15

Najnovšia verzia Java je Java 20 alebo JDK 20 vydaná 21. marca 2023. JDK 17 je najnovšia LTS platformy Java SE. Postupne si budeme predstavovať zmeny v Jave od verzie 15 a v tomto článku si predstavíme hlavné programátorské zmeny vo verzii 15. Text BlocksO tejto funkcionalite sme už rozprávali. Teraz je však táto funkcia zaradená ako štandard a nie ako preview funkcionalita. Napriek tomu si to znovu vysvetlíme, ak si napríklad túto časť preskočil v minulosti hlavne kvôli preview statusu.  Funkcia Text Blocks umožňuje zápis viacriadkových reťazcov (texty) jednoducho. Týmto spôsobom je možné zapisovať ľahšie čitateľné reťazce, ktoré obsahujú viac riadkov alebo formátovaný text. Text Blocks začínajú a končia trojitými úvodzovkami ("""") a môžu obsahovať text, ktorý je rozdelený do viacerých riadkov bez potreby zadávať znak nového riadku /n. Java tu  zohľadňuje nové riadky a na pozadí automaticky odstraňuje nadbytočné biele znaky (medzery, tabulátory) na začiatku riadkov. Ako sa správa to automatické odstraňovanie? Pozrime sa na príklad: String html = """ <html> <body> <p>Hello, World!</p> </body> </html> """;Jednoduchý kúsok HTML. Ak si všimneš, tak tag <html> je od pravej ľavej strany odsadený. Je tam viacero bielych znakov. Keď tento text budeš používať ďalej, tak tieto biele znaky budú odstránené. Na ďalších príkladoch si všimni ako sa pohybuje zelená zvislá čiara. Podľa nej zistíš ako sa odstraňujú biele nadbytočné znaky.  [Ukážka kódu][Ukážka kódu][Ukážka kódu] Nakoniec si daj pozor, aby tvoj text nezačínal na riadku prvých trojitých úvodzoviek, lebo to by bol chybný zápis. Za prvými trojitými úvodzovkami musí byť nový riadok. [Ukážka kódu]Ďalšie príklady: String json = """ { "id": "1", "name": "Jaro", "age": "35" } """;  String sql = """ SELECT id, name, age FROM users WHERE age > 10 """;Formátovanie textu: String formattedText = """ Id: %d Name: %s Age: %d “”".formatted(“1”, “Jaro”, “35”);RecordsJava Records boli uvedené už v Jave 14 ako skorý preview. V Jave 15 boli nejaké zmeny a vylepšienia. Poďme si povedať, čo sú tie Java Records. V Jave 15 je táto funkcionalita stále v preview móde. Records je nový druh tried, ktoré slúžia na zjednodušenie práce s dátovými triedami. To sú triedy, ktoré majú slúžiť ako jednoduchý nositeľ informácie. Tieto triedy automaticky generujú konštruktory, metódy equals, hashCode a toString bez nášho zašpecifikovania. Príklady Vytvorenie record: public record User(int id, String name, int age) {} Použitie: User user = new User(1, "Jaro", 35);System.out.println(user.name()); // Výstup: Jaro Je to rozdiel oproti klasickej definícii triedy, kde si musel zašpecifikovať konštruktor a get metódy. Je to kratšie a prehľadnejšie. Ďalšie príklady: record Employee(String name, int id) {} Employee employee = new Employee("Janka", 534); String name = employee.name(); int id = employee.id();Máme možnosť zadefinovať vlastný konštruktor. Napríklad ak chceme urobiť nejaký test nad vstupnými dátami:  record Adult(int age, String Name) { public Adult { if (age < 18) { throw new IllegalArgumentException("Must be adult."); } } } Adult validAdult = new Adult(35, "Jaro"); Adult invalidRange = new Adult(10, "Fero"); // exceptionMôžeme pridávať metódy:  record Circle(Point center, double radius) { double area() { return Math.PI * radius * radius; } } Circle circle = new Circle(new Point(0, 0), 5); double area= circle.area(); Pattern Matching for instanceof je funkcia, ktorá bola zavedená v Jave 15 ako druhá fáza návrhu (preview feature). Táto funkcia zjednodušuje testovanie typu objektu a získavanie hodnoty z objektu.  Pattern MatchingPattern Matching je znovu predstavený v statuse preview. Umožňuje kombinovať overenie typu a pretypovanie do jedného kroku, čo zlepšuje čitateľnosť a zjednodušuje kód. Všimni si, že v podmienke sme predstavili premennú s typu String. Táto sa nazýva binding variable. Object obj = "Hello, World!"; if (obj instanceof String s) { System.out.println("Length: " + s.length()); } else { System.out.println("Not a string"); }V minulosti to vyzeralo takto:  Object obj = "Hello, World!"; if (obj instanceof String) { String text = (String) s; System.out.println("Length: " + s.length()); } else { System.out.println("Not a string"); } Ďalšie príklady: Object data = List.of("one", "two", "three"); if (data instanceof String s) { System.out.println("Length: " + s.length()); } else if (data instanceof List<?> list) { System.out.println("Size: " + list.size()); } Object obj = 3.14; if (obj instanceof Integer i || obj instanceof Double d) { System.out.println("Number: " + obj); } else { System.out.println("Not a number"); }Sealed ClassesSealed Classes je v Jave 15 ako preview. Sealed Classes umožňujú obmedziť rozsah dedenia tried. Týmto spôsobom môžeš kontrolovať, ktoré triedy môžu dediť od tejto triedy. Sealed Classes sú často používané v kombinácii s pattern matchingom. Majme sealed triedu: sealed class Shape permits Circle{}  Trieda, ktorej povoľuje dedenie musí byť final. final class Circle extends Shape { ...} final class Rectangle extends Shape { ...}   Teraz sme povedali, že od triedy Shape môže dediť len Circle. Pri iných triedach, ktoré by sa pokúsili dediť od triedy Shape bude chyba is not allowed in the sealed hierarchy. Tento princíp vieme využiť napríklad takto: double calculateArea(Shape shape) { return switch (shape) { case Circle c -> Math.PI * c.getRadius() * c.getRadius(); case Rectangle r -> r.getWidth() * r.getHeight(); }; } Na vstupe máme Shape a vieme, že od neho môže dediť len Circle a Rectangle. Hidden ClassesPre bežného používateľa nezaujímavé a pravdepodobne to nikdy nevyužije. V skratke ide o to, že je možné vytvárať triedy zabehu aplikácie a nie sú viditeľné ani použitím reflexie.
Ako sa tvorí JavaScript
Vzdelávanie
02.05.2020
Lubo Herkoo

Ako sa tvorí JavaScript

Tento rok nám frajeri z TC-39 (ak nevieš čo TC-39 je, čítaj ďalej) naservírujú novú verziu ECMAScript špecifikácie - novinky, ktoré môžeme ako vývojári používať pri programovaní v JavaScript-e. BigInt, optional chaining, Promise.allSettled, String.matchAll, globalThis a iné. O tom, aké problémy riešia tieto nové funkcionality si povieme v ďalšom blogu. Tento text je venovaný špecifikácii ECMAScript a okrem iného sa dočítaš: • prečo potrebujeme špecifikáciu na to, ako implementovať JavaScript Engine v prehliadači • prečo sa špecifikácia nevolá JavaScript, ale ECMAScript a čo je to vlastne tá ECMA • ako dlho trvá, kým sa nápad novej funkcionality jazyka JavaScript stane jeho súčasťou ECMAScript?V roku 1995 vyhrával oscary Tom Hanks s filmom Forest Gump, v rádiách fičal Gansta's Paradise od Coolia a web BBC vyzeral takto:[Image] 80% používateľov internetu surfovalo v prehliadači Netscape Navigator a Microsoft ešte len končil vývoj Internet Explorer-a. Ak ho vôbec niekedy dokončili. Nie všetci boli spokojní s tým, ako web vtedy fungoval: statický obsah, zdieľanie dokumentov a žiadny pohyb. Softvérový inžinier z Netscape - Mark Andreessen - chcel vytvoriť jazyk, ktorý by s ľahkosťou používali nielen vývojári, ale aj dizajnéri a do webov priniesli štipku interaktivity. Buttony a tak. Brendan Eich (meno si treba zapamätať - je to frajer) je človek, ktorý tento programovací jazyk začal tvoriť. Prvým pokusom bola implementácia jazyka SCHEME do prehliadača Netscape. Mimochodom - javisti v SUN Microsystems premýšľali nad spôsobom, ako spúšťať Java kód v prehliadači, čím tiež priniesli interaktivitu do webových stránok. Táto implementácia však nebola jednoduchá na používanie, a preto ostala voľbou korporátnych mastičov. Mocha (takto sa volala prvá verzia dnešného JavaScriptu) bola vytvorená ako alternatíva pre dizajnérov a vývojárov. Mocha » LiveScript » JavaScript vs JScriptVytvorenie prvej verzie Mocha trvalo len 10 dní. Neskôr bol tento jazyk premenovaný na LiveScript a potom na finálny JavaScript. Fun fact: slovo "Java" sa tam nedostalo náhodou - bol to však len marketingový spôsob, ako sa zviesť na popularite jazyka Java. Internet Explorer chcel tiež držať krok s dobou, a preto začali aj v MS pracovať na implementácii čohosi, čo bolo veľmi podobné JavaScriptu. Finálny jazyk sa volal JScript. Implementácia však bola natoľko odlišná od JavaScript-u, že tieto implementácie neboli navzájom kompatibilné! Výsledkom bola skutočnosť, že nebolo možné vytvoriť jeden web, ktorý by fungoval v oboch prehliadačoch. Tak vznikli vtedy slávne nálepky do footerov: "Best viewed in Internet Explorer" a "Best viewed in Netscape Navigator".[Image] Tvoriť weby v tej dobe nebola žiadna sranda, vývojári volali po štandarde, ktorý zjednotí implementácie JavaScriptu a JScriptu. Preto bol vytvorený štandard ECMAScript, ktorý zastrešila organizácia ECMA International. Tá fungovala už dávno predtým a jej úlohou bolo práve vytvárať štandardy pre informačné a komunikačné systémy. Od novembra 1996 existuje teda štandard ECMAScript, ktorý popisuje, ako má byť implementovaný JavaScript Engine. Fun fact: štandard nemôže niesť ikonický názov JavaScript, pretože na toto slovo až do dnešného dňa vlastní copyright firma Oracle. ECMA-262 a TC-39 - whaaat?ECMA International zastrešuje veľa štandardov, ten, ktorý sa týka implementácii JavaScriptu dostal číslo 262. ECMA-262 je teda názov štandardu, ktorý opisuje implementáciu JavaScriptu. Nie je to žiadne príjemné čítanie, aha. Komisia (rozumej: živé bytosti, ľudia), ktorá rozhoduje o tom, aké nové funkcie bude nová verzia JavaScriptu obsahovať, dostala zase názov TC-39. Členom tejto komisie nie je hocikto. Sú to frajeri - vybraní ľudia, ktorí zastupujú veľké firmy pôsobiace na online trhu (Facebook, PayPal, Google, Amazon, Mozilla...)[Image] Nová funkcionalita v JS - schvaľovací procesČlenovia TC-39 organizujú meetingy (väčšinou online) každé dva mesiace. Cieľom týchto meetingov je dopodrobna rozkecať a zanalyzovať, ktoré funkcie bude obsahovať nová verzia ECMAScript, alebo aké opravy budú v tejto verzii vykonané. Zaujímavé je, že táto komisia funguje na princípe zhody - takmer všetci členovia komisie musia súhlasiť s návrhom, aby sa ním čo i len začali zaoberať. Celkom zaujímavé je napríklad sledovať, ako sa dostala do JavaScript-u podpora pre BigInt - brutálne veľké čísla. Lebo v JavaScripte sme doteraz mohli používať len strašne veľké čísla. Stage 0Každý návrh začína na takzvanej nultej úrovni - Stage 0. Niektorý z členov TC-39 vytvorí dokument, ktorý popisuje danú funkcionalitu a aký problém rieši. Na meetingu členov TC-39 tento problém prednesie a členovia rozhodli, že napr. BigInt je super vec a posunuli ho do ďalšieho Stage-u. Stage 1Stage 1 je parádny úspech a zároveň to znamená, že niekedy v budúcnosti bude pravdepodobne daná funkcionalita súčasťou JavaScriptu. Všetkým (alebo takmer všetkým) členom TC-39 sa tento nápad páči a súhlasia s ním. Môže to však trvať roky. BigInt funkcionalita musí byť ešte podrobnejšie popísaná, musí obsahovať príklady, ako sa bude používať a analýzu, či to neprinesie aj nejaké problémy. Stage 2Takzvaný Draft. V tejto fáze je viac menej isté, že funkcionalita bude súčasťou JavaScript-u a preto musí byť ešte podrobnejšie popísaná. Toto je tiež stage, kedy sa premýšľa nad vhodnou syntaxou a rôznymi detailami používania novej funkcionality. V prípade BigInt funkcionality napr. členovia rozhodli, že bude vhodné, ak BigInt číslo bude obsahovať na konci znak n - aby prehliadač (engine) vedel, že pracuje s brutálne veľkým číslom, a nie len strašne veľkým číslom. const bigIntCislo = 12345n; const obycajneCislo = 12345; Stage 3Funkcionalita je takmer hotová a potrebuje feedback od vývojárov a vonkajšieho sveta. Všetci testujú BigInt vo svojich programoch. Tvorcovia internetových prehliadačov sa predbiehajú, kto z nich bude podporovať BigInt ako prvý - pretože implementovať BigInt už má zmysel. Stage 4Všetko je otestované a BigInt je súčasťou špecifikácie ECMAScript. Hotovo. ZáverCelý proces napr. v prípade BigInt trval 2 roky. Viem si predstaviť, že schvaľovanie niektorých ešte komplexnejších funkcionalít môže trvať ešte dlhšie. Frajerom z TC-39 ale môžeme ďakovať za to, že do JavaScriptu sa dostávajú naozaj len veci, ktoré dávajú zmysel.