Hlavní navigace

Novinky Javy 10: typová inferencia lokálnych premenných

Ján Bodnár

Vyšla najnovšia produkčná verzia Javy 10. Nová verzia Javy tak prichádza šesť mesiacov po poslednej verzii (Java 9). Reč je o Java SE (Java Standard Edition), ktorej implementáciu ponúkajú Oracle JDK a OpenJDK.

Doba čtení: 5 minut

Java JEP dokumenty

Zmeny do jadra jazyka sa implementujú pomocou formálnych dokumentov nazvaných JDK Enhancement-Proposal (JEP). Každý z týchto dokumentov má pridelené svoje identifikačné číslo. Java 10 prináša realizáciu nasledovných JEP dokumentov:

  • 286: Local-Variable Type Inference
  • 296: Consolidate the JDK Forest into a Single Repository
  • 304: Garbage-Collector Interface
  • 307: Parallel Full GC for G1
  • 310: Application Class-Data Sharing
  • 312: Thread-Local Handshakes
  • 313: Remove the Native-Header Generation Tool (javah)
  • 314: Additional Unicode Language-Tag Extensions
  • 316: Heap Allocation on Alternative Memory Devices
  • 317: Experimental Java-Based JIT Compiler
  • 319: Root Certificates
  • 322: Time-Based Release Versioning

JEP 286 – typová inferencia lokálnych premenných

Ide o najzaujímavejšiu novinku pre bežného Java programátora. Zaviedlo sa nové kľúčové slovo var, ktoré môžeme použiť na ľavej strane priradenia. Java kompilátor si zistí typ premennej z pravej strany priradenia. Tomuto procesu sa hovorí typová inferencia.

$ wget http://download.oracle.com/otn-pub/java/jdk/10+46/76eac37278c24557a3c4199677f19b62/jdk-10_linux-x64_bin.tar.gz
$ tar xzvf jdk-10_linux-x64_bin.tar.gz
$ mv jdk-10 ~/bin

Stiahneme si Oracle JDK a rozbalíme skomprimovaný archív. Premiestnime inštalačný adresár do nami zvoleného adresára.

$ ~/bin/jdk-10/bin/java --version
java 10 2018-03-20
Java(TM) SE Runtime Environment 18.3 (build 10+46)
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10+46, mixed mode)

Overíme si verziu Javy.

$ mkdir -p src/com/zetcode bin
$ touch src/com/zetcode/JavaNewsEx.java
$ tree
.
├── bin
└── src
    └── com
        └── zetcode
            └── JavaNewsEx.java
$ nano src/com/zetcode/JavaNewsEx.java

Keďže v súčasnosti ešte vývojové prostredia Javu 10 nepodporujú, skompilujeme si ukážkový program ručne. Najprv si vytvoríme adresárovú štruktúru. Otvoríme si súbor v nejakom textovom editore (napríklad nano) a skopírujeme nasledovný zdrojový kód:

package com.zetcode;

import java.util.List;

public class JavaNewsEx {

    public static void main(String[] args) {

        var name = "Jonathan";
        System.out.printf("The word %s has %d characters%n", name, name.length());

        var age = 34;
        age += 12;

        System.out.println(age);

        var words = List.of("cloud", "fine", "pen", "dog",
            "temper", "sky", "book");

        System.out.println(words);
    }
}

Na ľavej strane priradení používame kľúčové slovo var. Ide o najväčšiu zmenu v písaní zdrojového kódu Javy.

$ ~/bin/jdk-10/bin/javac -d bin src/com/zetcode/JavaNewsEx.java
$ ~/bin/jdk-10/bin/java -cp bin com.zetcode.JavaNewsEx
The word Jonathan has 8 characters
46
[cloud, fine, pen, dog, temper, sky, book]

Príklad skompilujeme a spustíme.

JEP 296 – konsolidácia repozitárov

Doteraz bola Java rozdelená do viacerých repozitárov. Kvôli zjednodušeniu vývoja sa všetky repozitáre zjednotia do jediného repozitáru. Pre manažovanie zdrojového kódu Javy sa využíva Mercurial.

JEP 304 – nové rozhranie pre Garbage Collector

Nové rozhranie umožní izoláciu kódu rôznych implementácií GC. Zjednoduší to pridávanie nových GC algoritmov a ich odstránenie z JDK buildov.

JEP 307 – paralelizovaný východzí Garbage Collector

Garbage collection je spôsob automatickej správy pamäte. Uvoľňuje objekty z dynamickej pamäte, ktoré už viac nie sú potrebné. Java 9 zaviedla nový východzí Garbage Collector, nazvaný Garbage-First (G1) collector. Tento nový Garbage Collector sa snaží výhnúť plnému cyklu uvoľňovania pamäte (full GC). Plný cyklus uvoľňovania pamäte zaťažuje procesor a spôsobuje zdržanie, čím sa znižuje responzívnosť aplikácie. Niekedy sa plnému cyklu však nedá vyhnúť; novinka je, že tento plný cyklus bude bežať vo viacerých vláknach, čím sa zlepší jeho výkon.

JEP 310 – zdieľanie aplikačných tried

Od čias Javy 5 sa využíva optimalizačný mechanizmus, ktorý vytvorí zo systémových tried zdielaný archív. Archív je mapovaný v pamäti a je k dispozícii Java aplikáciám. Tento proces sa rozšíri aj o aplikačné triedy. Týmto sa dosiahne rýchlejší štart aplikácií a dôjde k úspore využívania pamäte. Testy ukazujú, že zrýchlenie môže byť až o 30% a úspora v stovkách megabajtov.

JEP 312 – handshakes v lokálnych vláknach

Táto novinka zlepší výkon virtuálnych strojov Javy. Týka sa globálnych safepointov. Globálny safepoint je okamih, keď Java virtuálna mašina zastaví výkonávanie kódu. Anglicky sa tomu hovorí priliehavo „stop the world“. Globálne safepointy sa využívajú pri uvoľnovaní pamäte, JIT kompilácii, alebo debuggovaní. Počas globálneho safepointu sú všetky vlákna pozastavené. Optimalizačná technika, ktorú prináša tento JEP, umožní v niektorých prípadoch vyhnúť sa globálnym safepointom.

JEP 313 – odstránenie javah nástroja

Nástroj javah vytvára C hlavičkové a zdrojové súbory z Java class súborov, ktoré sú potrebné na vytvorenie natívnych metód (JNI). Táto funkcionalita bola presunutá do Java kompileru ( javac) v Jave 8, preto sa stal nástroj javah nadbytočným.

JEP 314 – pridanie nových Unicode tagov

Java lokalizačné a príbuzné API boli rozšírené o nasledovné jazykové tagy:

  • cu (currency type)
  • fw (first day of week)
  • rg (region override)
  • tz (time zone)

JEP 316 – alokácia haldy na alternatívnych pamätiach

Tento dokument umožňuje alokovať virtuálnemu stroju haldu na alternatívnych pamäťových zariadeniach, napríklad typu NV-DIMM. To sa môže využívať pri systémoch s hybridnými pamäťami.

JEP 317 – experimentálny Java-JIT kompiler pre Linux

Na platforme Linux/x64 bol pridaný experimentálny Java-JIT kompiler. Ide o snahu otestovať možnosti Java-JIT kompilátorov pre JDK. Just In Time (JIT) kompilácia je optimalizačná technika pre urýchlenie behu programov. Keď sa Java aplikácia spustí, je vybraný Java bytecode preložený priamo do strojového kódu na danej platforme. Toto úsilie je súčasť projektu Metropolis, ktorého cieľom je minimalizovanie C++ kódu pri implementácii behového prostredia Javy. Hovorí sa tomu tiež Java-on-Java.

JEP 319 – koreňové certifikáty

Koreňové certifikáty získali licenciu open-source a sú priamo pridané do JDK buildov. Týmto krokom sa vyšlo v ústrety hlavne vývojárom, ktorý používali OpenJDK.

JEP 322 – nový spôsob tvorby verzií Javy

Reťazec, ktorým sa definuje verzia Javy, sa mení. Po novom reťazec zahŕňa aj dátum, kedy bola nová verzia Javy vydaná. Zohľadňuje sa tiež aj nový šesťmesačný cyklus vydávania verzií Javy. Marcová verzia Javy je JDK 10, septembrová bude JDK 11. Java feature release bude každých šesť mesiacov, update release každý štvrťrok. Počnúc od septembrovej verzie Javy budú mať feature release Javy dlhodobú podporu minimálne tri roky. (Java 9 nebude mať dlhodobú podporu.)

$ ~/bin/jdk-9.0.4/bin/java --version
java 9.0.4
Java(TM) SE Runtime Environment (build 9.0.4+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.4+11, mixed mode)

V tomto výpise vidíme verziu Javy 9.

MIF18 tip v článku témata

$ ~/bin/jdk-10/bin/java --version
java 10 2018-03-20
Java(TM) SE Runtime Environment 18.3 (build 10+46)
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10+46, mixed mode)

V tomto výpise vidíme verziu Javy 10.

V článku sme vychádzali z informácií na stránke openjdk.java.net

Našli jste v článku chybu?