Hlavní navigace

Vyšla Java 11: menší core systém a experimentálne garbage collectory

Ján Bodnár

V utorok 25. septembra vyšla najnovšia verzia Javy, Java 11. Vychádza po šiestich mesiacoch od Javy 10, ktorá uzrela svetlo sveta 22. marca 2018. V tejto verzii dominujú predovšetkým údržbové a organizačné zmeny.

Doba čtení: 5 minut

Údržba

Java 11 upratuje vo veľkom. Z JDK sa odstránili moduly Java EE, CORBA a Java FX. Tieto technológie budú do budúcnosti dostupné z Maven repozitárov. Odstránenie modulov enterprise Javy je logickým krokom, niekoho môže odstránenie Java FX prekvapiť. Nashorn JavaScript Engine sa označil za neodporúčaný; v budúcnosti sa z JDK odstráni. Dôvodom má byť prudký vývoj JavaScriptu a z toho vyplývajúca náročnosť údržby.

Java applety definitívne skončili. Applety boli jednou z najstarších dynamických webových technológií. Kedysi veľmi sľubne vyzerajúca technológia nikdy nedosiahla svoj potenciál a bola sprevádzaná neustálymi bezpečnostnými incidentmi. Spolu s appletmi skončila a Java Web Start technológia.

Vývojári chcú dosiahnuť čo najmenší core systém, aby mohla byť Java implementovaná na čo najviac zariadení. Chcú zároveň zrýchliť štart aplikácií. Dokonca sa zvažuje odstránenie Swingu. Tieto zmeny sú tiež poháňané modularizáciou Javy, ktorú naštartovala Java 9.

Testovanie noviniek

Na testovanie si môžeme stiahnuť OpenJDK alebo Oracle JDK.

IntelliJ IDEA 2018.2.4 už v sebe zahŕňa podporu Javy 11; je potrebné tam odškrtnúť súhlas s experimentálnou podporou.

~/bin/jdk-11/bin/java --version
java 11 2018-09-25
Java(TM) SE Runtime Environment 18.9 (build 11+28)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11+28, mixed mode)

Pre testovacie účely som použil Oracle JDK.

Štart jednosúborových programov

Medzi najzaujímavejšie novinky patrí možnosť spúšťania jednosúborových Java aplikácií. Súbory nie je potrebné pred spustením skompilovať pomocou nástroja  javac. Motívom tejto novinky boli zjednodušiť výučbový proces a tvorbu menších programov. Nielenže nám odpadá potreba zvlášť kompilovať súbor, ale tiež sa nám nezaprace priestor byte kód súbormi. Nie je tiež potrebné sa zaťažovať balíčkovými pravidlami.

package com.zetcode;

public class SimpleEx {

    public static void main(String[] args) {

        System.out.println("Java 11 example");
    }
}

Majme jednoduchý Java zdrojový súbor. Tento súbor nemusí byť vytvorený v podadresári com/zetcode.

$ ~/bin/jdk-11/bin/java SimpleEx.java
Java 11 example

Aplikáciu spustíme, ako keby šlo o skriptovací jazyk.

Štandardizovaný HttpClient

Od Javy 9 bol v inkubátore zabudovaný HttpClient. Java 11 ho štandardizuje. HttpClient sa nachádza v balíčku java.net.http.

package com.zetcode;

import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;

public class HttpClientEx {

    public static void main(String[] args) {

        var client = HttpClient.newHttpClient();
        var request = HttpRequest.newBuilder()
            .uri(URI.create("http://webcode.me"))
            .build();

        client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
            .thenApply(HttpResponse::body)
            .thenAccept(System.out::println)
            .join();
    }
}

V súbore HttpClientEx.java vytvoríme klienta a vyšleme asynchrónne požiadavku na server webcode.me. Odpoveď vypíšeme na konzolu.

$ ~/bin/jdk-11/bin/java HttpClientEx.java
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>My html page</title>
</head>
<body>

    <p>
        Today is a beautiful day. We go swimming and fishing.
    </p>

    <p>
            Hello there. How are you?
    </p>

</body>
</html>

Dostaneme takýto HTML výstup.

Nové reťazcové metódy

Do jadra jazyka boli zabudované nové metódy na prácu s reťazcami. Metóda repeat() opakuje n-krát daný reťazec, metódy stripTrailing(), stripLeading() a strip() odstraňujú biele znaky. Šikovná metóda isBlank() testuje či je reťazec tvorený len bielymi znakmi a metóda lines() nám vytvorí prúd z reťazca, ktorého časti sú oddelené znakom nového riadku.

package com.zetcode;

public class StringMethodsEx {

    public static void main(String[] args) {

        var word = "falcon ";

        System.out.println(word.repeat(5));

        var word2 = "\tnice blue\t";
        System.out.println(word2 + "sky");
        System.out.println(word2.stripTrailing() + "sky");
        System.out.println(word2.stripLeading() + "sky");
        System.out.println(word2.strip() + "sky");

        var word3 = "  ";
        System.out.println(word3.isEmpty());
        System.out.println(word3.isBlank());

        var words = "falcon\neagle\nsky\nwood\nforest";
        words.lines().forEach(System.out::println);

    }
}

V tomto príklade si otestujeme všetky spomínané metódy.

$ ~/bin/jdk-11/bin/java StringMethodsEx.java
falcon falcon falcon falcon falcon
    nice blue   sky
    nice bluesky
nice blue   sky
nice bluesky
false
true
falcon
eagle
sky
wood
forest

Metóda asMatchPredicate

Pre prácu s regulárnymi výrazmi máme novú metódu asMatchPredicate().

package com.zetcode;

import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class AsMatchPredicateEx {

    public static void main(String[] args) {

        var words = List.of("dog", "Dog", "DOG", "Doggy");

        var pred = Pattern.compile("dog",
            Pattern.CASE_INSENSITIVE).asMatchPredicate();

        words.forEach((word) -> {

            if (pred.test(word)) {
                System.out.printf("%s matches%n", word);
            } else {
                System.out.printf("%s does not match%n", word);
            }
        });
    }
}

Metóda asMatchPredicate() vytvorí zo skompilovaného vzoru predikát, na ktorom potom voláme test() metódu.

$ ~/bin/jdk-11/bin/java AsMatchPredicateEx.java
dog matches
Dog matches
DOG matches
Doggy does not match

Metódy readString a writeString

Trieda java.nio.file.Files získala nové metódy. Metóda readString() načíta obsah súboru do reťazca a writeString() zapíše sekvenciu znakov do súboru.

package com.zetcode;

import java.nio.file.Path;
import java.nio.file.Files;
import java.io.IOException;

public class WriteStringEx {

    public static void main(String[] args) throws IOException {

        var words = "forest\nwood\nsky\nrock";

        Files.writeString(Path.of("words.txt"), words);
    }
}

Tento program zapíše štyri slová do súboru words.txt.

package com.zetcode;

import java.nio.file.Path;
import java.nio.file.Files;
import java.io.IOException;

public class ReadStringEx {

    public static void main(String[] args) throws IOException {

        var fileName = "words.txt";

        var data = Files.readString(Path.of("words.txt"));

        System.out.println(data);
    }
}

Následne v tomto ďalšom príklade načítame dáta zo súboru words.txt a vypíšeme ich na obrazovku.

MIF18 tip v článku Steiner

$ ~/bin/jdk-11/bin/java ReadStringEx.java
forest
wood
sky
rock

Ďalšie zmeny

Java 11 ďalej prináša dva experimentálne garbage collectory, implementáciu Unicode 10 štandardu, novinky v oblasti bezpečnosti (TLS 1.3 protokol, kryptografické algoritmy) a Java Flight Recorder, čo je framework určený na profilovanie a spracovanie udalostí.

Ďalšie informácie môžete získať na openjdk.java.net/projects/jdk/11/ a JDK 11 Release Notes.

Našli jste v článku chybu?