Odvodenie typu Java 10 LocalVariable

Tento článok je súčasťou série: • Java 10 LocalVariable Type-Inference (aktuálny článok) • Vylepšenia výkonu Java 10

• Java 10 Nové funkcie

1. Prehľad

Jedným z najviditeľnejších vylepšení v JDK 10 je odvodenie typu lokálnych premenných pomocou inicializátorov.

Tento tutoriál poskytuje podrobnosti o tejto funkcii s príkladmi.

2. Úvod

Až do Javy 9 sme museli výslovne spomenúť typ lokálnej premennej a zabezpečiť, aby bola kompatibilná s inicializátorom použitým na jej inicializáciu:

String message = "Zbohom, Java 9";

V prostredí Java 10 by sme takto mohli deklarovať lokálnu premennú:

@Test public void whenVarInitWithString_thenGetStringTypeVar () {var message = "Dobrý deň, Java 10"; assertTrue (inštancia správy reťazca); }

Neposkytujeme dátový typ správa. Namiesto toho označíme správa ako vara kompilátor odvodí typ súboru správa od typu inicializátora nachádzajúceho sa na pravej strane.

Vo vyššie uvedenom príklade typ správa bolo by String.

Upozorňujeme, že táto funkcia je k dispozícii iba pre miestne premenné s inicializátorom. Nemožno ho použiť pre členské premenné, parametre metódy, návratové typy atď. - je potrebný inicializátor, pretože bez ktorého kompilátor nebude schopný odvodiť typ.

Toto vylepšenie pomáha pri znižovaní štandardného kódu; napríklad:

Mapová mapa = nová HashMap ();

Toto je teraz možné prepísať ako:

var idToNameMap = nový HashMap ();

To tiež pomáha zamerať sa skôr na názov premennej ako na typ premennej.

Ďalšia vec, ktorú je potrebné poznamenať, je, že var nie je kľúčové slovo - to zaisťuje spätnú kompatibilitu programov, ktoré používajú var povedzme, ako názov funkcie alebo premennej. var je názov vyhradeného typu, rovnako ako int.

Na záver si uvedomte, že existuje žiadna runtime réžia pri používaní var nerobí z Javy dynamicky písaný jazyk. Typ premennej je odvodený aj v čase kompilácie a nemožno ho neskôr zmeniť.

3. Neoprávnené použitie var

Ako bolo spomenuté predtým, var bez inicializátora nebude fungovať:

var n; // chyba: nie je možné použiť 'var' na premennú bez inicializátora

Rovnako by to nefungovalo, keby sa inicializovalo pomocou nulový:

var emptyList = null; // error: variable initializer is 'null'

Nebude to fungovať pre nelokálne premenné:

public var = "ahoj"; // chyba: „var“ tu nie je povolená

Lambda výraz potrebuje výslovný cieľový typ, a teda var nemôže byť použitý:

var p = (Reťazec s) -> s.length ()> 10; // chyba: výraz lambda vyžaduje explicitný cieľový typ

To isté platí pre inicializátor poľa:

var arr = {1, 2, 3}; // chyba: inicializátor poľa vyžaduje explicitný cieľový typ

4. Pokyny pre používanie var

Sú situácie, kedy var môžu byť použité legálne, ale nemusí to byť dobrý nápad.

Napríklad v situáciách, keď by sa kód mohol stať menej čitateľným:

var výsledok = obj.prcoess ();

Tu je síce legálne použitie var, je ťažké pochopiť typ vrátený proces ()kód je tak menej čitateľný.

java.net má samostatný článok o pokynoch pre štýl pre odvodenie lokálnych premenných typov v Jave, ktorý hovorí o tom, ako by sme mali pri používaní tejto funkcie používať úsudok.

Ďalšia situácia, v ktorej je najlepšie vyhnúť sa var je v prúdoch s dlhým potrubím:

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

Využitie var môže tiež spôsobiť neočakávané výsledky.

Napríklad, ak ho použijeme s diamantovým operátorom zavedeným v Jave 7:

var empList = nový ArrayList ();

Typ empListbude ArrayLista nie Zoznam. Ak to chceme mať ArrayList, budeme musieť byť výslovní:

var empList = nový ArrayList ();

Použitím var s nedenotovateľnými typmi môže spôsobiť neočakávanú chybu.

Napríklad, ak použijeme var s inštanciou anonymnej triedy:

@Test public void whenVarInitWithAnonymous_thenGetAnonymousType () {var obj = new Object () {}; assertFalse (obj.getClass (). equals (Object.class)); }

Teraz, keď sa pokúsime priradiť ďalší Objektdo obj, dostali by sme chybu kompilácie:

obj = nový objekt (); // chyba: Objekt nie je možné previesť na 

Je to preto, lebo odvodený typ obj nie je Objekt.

5. Záver

V tomto článku sme videli novú funkciu odvodenia typu lokálnej premennej Java 10 s príkladmi.

Útržky kódu ako obvykle nájdete na GitHub.

Ďalšie » Vylepšenia výkonu Java 10