Java 10 LocalVariable Type-Inference

Ovaj je članak dio serije: • Java 10 LocalVariable Type-Inference (trenutni članak) • Poboljšanja performansi Java 10

• Java 10 nove značajke

1. Pregled

Jedno od najvidljivijih poboljšanja u JDK 10 je zaključivanje tipa lokalnih varijabli s inicijalizatorima.

Ovaj vodič nudi detalje o ovoj značajci s primjerima.

2. Uvod

Do Java 9, morali smo izričito spomenuti vrstu lokalne varijable i osigurati da je kompatibilna s inicijalizatorom koji se koristi za njezinu inicijalizaciju:

String message = "Zbogom, Java 9";

U Javi 10, ovako bismo mogli proglasiti lokalnu varijablu:

@Test public void whenVarInitWithString_thenGetStringTypeVar () {var message = "Zdravo, Java 10"; assertTrue (poruka instance Stringa); }

Ne pružamo vrstu podataka za poruka. Umjesto toga, označavamo poruka kao var, a kompajler izvodi vrstu poruka od tipa inicijalizatora prisutnog na desnoj strani.

U gornjem primjeru, vrsta poruka bilo bi Niz.

Imajte na umu da je ova značajka dostupna samo za lokalne varijable s inicijalizatorom. Ne može se koristiti za varijable člana, parametre metode, vrste povratka, itd. - potreban je inicijalizator, bez kojeg prevodilac neće moći zaključiti o tipu.

Ovo poboljšanje pomaže u smanjenju šifre pločice; na primjer:

Karta karte = novi HashMap ();

Ovo se sada može prepisati kao:

var idToNameMap = nova HashMap ();

Ovo također pomaže usredotočiti se na naziv varijable, a ne na tip varijable.

Još jedna stvar koju treba napomenuti je to var nije ključna riječ - ovo osigurava povratnu kompatibilnost za programe koji koriste var recimo, kao ime funkcije ili varijable. var je rezervirano ime tipa, baš kao i int.

Konačno, imajte na umu da postoji nema dodatnih troškova tijekom korištenja var niti Java čini dinamično tipkanim jezikom. Vrsta varijable se još uvijek zaključuje u vrijeme sastavljanja i ne može se kasnije mijenjati.

3. Nelegalna uporaba var

Kao što je ranije spomenuto, var neće raditi bez inicijalizatora:

var n; // pogreška: ne može koristiti 'var' na varijabli bez inicijalizatora

Niti bi funkcioniralo ako se inicijalizira s null:

var emptyList = null; // pogreška: inicijalizator varijable je 'null'

Neće raditi za ne-lokalne varijable:

javni var = "zdravo"; // pogreška: 'var' ovdje nije dopušten

Lambda izraz treba eksplicitni ciljni tip, a time i var ne može se koristiti:

var p = (Niz s) -> s.dužina ()> 10; // pogreška: lambda izraz treba eksplicitni ciljni tip

Isti je slučaj s inicijalizatorom niza:

var arr = {1, 2, 3}; // pogreška: inicijalizatoru niza potreban je eksplicitni ciljni tip

4. Smjernice za upotrebu var

Postoje situacije u kojima var može se koristiti legalno, ali možda nije dobra ideja.

Na primjer, u situacijama kada bi kôd mogao postati manje čitljiv:

var rezultat = obj.prcoess ();

Ovdje, iako legalna upotreba var, postaje teško razumjeti vrstu koju je vratio postupak()čineći kod manje čitljivim.

java.net ima posvećen članak o Smjernicama za stil za zaključivanje lokalnih varijabli na Javi koji govori o tome kako bismo trebali koristiti prosudbu dok koristimo ovu značajku.

Još jedna situacija u kojoj je najbolje izbjegavati var je u potocima s dugim cjevovodom:

var x = emp.getProjects.stream () .findFirst () .map (String :: length) .orElse (0);

Upotreba var također može dati neočekivani rezultat.

Na primjer, ako ga koristimo s dijamantnim operatorom predstavljenim u Javi 7:

var empList = novi ArrayList ();

Tip empListbit će ArrayLista ne Popis. Ako želimo da bude ArrayList, morat ćemo biti izričiti:

var empList = novi ArrayList ();

Koristeći var s tipovima koji se ne mogu označiti mogao bi izazvati neočekivanu pogrešku.

Na primjer, ako koristimo var s anonimnom instancom klase:

@Test public void whenVarInitWithAnonymous_thenGetAnonymousType () {var obj = novi objekt () {}; assertFalse (obj.getClass (). jednako (Object.class)); }

Ako pokušamo dodijeliti drugu Objektdo obj, dobili bismo pogrešku pri kompilaciji:

obj = novi objekt (); // pogreška: objekt se ne može pretvoriti u 

To je zato što je izvedena vrsta obj nije Objekt.

5. Zaključak

U ovom smo članku vidjeli novu značajku zaključivanja tipa lokalne varijable Java 10 s primjerima.

Kao i obično, isječke koda možete pronaći na GitHubu.

Sljedeći » Poboljšanja performansi Java 10

$config[zx-auto] not found$config[zx-overlay] not found