TSM - Noutăți Java SE 18

Ovidiu Mățan - Fondator @ Today Software Magazine

Ne place să publicăm odată pe an un articol despre noutățile care apar în limbajul Java. În articolul de față vom prezenta trei schimbări introduse în Java SE 18, varianta de dezvoltare. A nu se confunda cu Java 17 care reprezintă versiunea de producție LTS (long term support).

UTF-8

A fost adoptat ca standard pentru lucrul cu șirurile de caractere. Până acum encodarea folosită depindea de sistemul de operare. În general, ca o bună practică, era indicat ca acesta să fie specificat înainte de folosire.

import java.nio.charset.*;
...
System.out.println(“default charset:“ 
  +Charset.defaultCharset());

Web Server

A fost inclus un server web în distribuția SDK-ului. Astfel, Java se aliniază cu majoritatea celorlalte frameworkuri cum ar fi node.js pentru JavaScript sau Laravel pentru PHP. Serverul web poate fi lansat din folderul /bin al distribuției Java 18.

> ./jwebserver
…
URL http://127.0.0.1:8000/

Folosirea sa este simplă. Lansat fără parametri va deservi directorul curent, dar acest lucru poate fi schimbat folosind parametrul -d. De asemenea, portul folosit se poate modifica prin -p

./jwebserver
**-d** /Library/Java/JavaVirtualMachines/jdk-18.0.2.jdk/Contents/Home/bin/public/
**-p** 9999

În exemplul de mai sus am lansat pe MacOs web serverul, a cărui cerință este să se specifice calea completă a folderului.

@snippet tag

Înlocuiește folosirea tagurilor @code și <pre >{ @code..} </pre >

{@snippet lang=”properties” :
   house.number=42
   house.street=Main St.
   house.town=AnyTown, USA
}

Vector API

Este introdus un nou API pentru operațiile cu vectori. Acestea sunt acum compilate la runtime într-un set optim de instrucțiuni pentru arhitectura procesorului folosit. Integrarea acestora necesită o adaptare a codului existent:

Codul standard:

void scalarComputation(float[] a, float[] b, float[] c) {
 for (int i = 0; i < a.length; i++) {
   c[i] = (a[i] * a[i] + b[i] * b[i]) 
      * -1.0f;
   }
}

Rescrierea acestuia folosind Vector API:

static final VectorSpecies SPECIES = FloatVector.SPECIES_PREFERRED;

void vectorComputation(float[] a, float[] b, float[] c) {
    int i = 0;
    int upperBound = SPECIES.loopBound(a.length);
    for (; i < upperBound; i += SPECIES.length()) {
        // FloatVector va, vb, vc;
       var va = FloatVector.fromArray(SPECIES, a, i);
       var vb = FloatVector.fromArray(SPECIES, b, i);
       var vc = va.mul(va)
                   .add(vb.mul(vb))
                   .neg();
       vc.intoArray(c, i);
    }
    for (; i < a.length; i++) {
        c[i] = (a[i] * a[i] + b[i] * b[i]) * -1.0f;
    }
}

Dacă vreți să citiți mai multe detalii despre Vector API vă recomand acest articol.