Java 10 LocalVariable Type-Inference

Тази статия е част от поредица: • Java 10 LocalVariable Type-Inference (текуща статия) • Java 10 Подобрения на производителността

• Java 10 нови функции

1. Общ преглед

Едно от най-видимите подобрения в JDK 10 е изводът на типа на локални променливи с инициализатори.

Този урок предоставя подробности за тази функция с примери.

2. Въведение

До Java 9 трябваше да споменем изрично типа на локалната променлива и да се уверим, че тя е съвместима с инициализатора, използван за инициализирането й:

String message = "Good bye, Java 9";

В Java 10 ето как бихме могли да декларираме локална променлива:

@Test public void whenVarInitWithString_thenGetStringTypeVar() { var message = "Hello, Java 10"; assertTrue(message instanceof String); }

Ние не предоставяме типа на съобщението . Вместо това маркираме съобщението като var и компилаторът извежда вида на съобщението от типа на инициализатора, присъстващ от дясната страна.

В горния пример видът на съобщението ще бъде String .

Имайте предвид, че тази функция е достъпна само за локални променливи с инициализатора. Не може да се използва за променливи на членове, параметри на метода, типове на връщане и т.н.

Това подобрение помага за намаляване на кода на шаблона; например:

Map map = new HashMap();

Това вече може да бъде пренаписано като:

var idToNameMap = new HashMap();

Това също помага да се съсредоточите върху името на променливата, а не върху типа на променливата.

Друго нещо, което трябва да се отбележи, е, че var не е ключова дума - това гарантира обратна съвместимост за програми, използващи var say, като функция или име на променлива. var е запазено име на тип, точно както int .

И накрая, обърнете внимание, че при използване на var няма режийни разходи по време на изпълнение, нито пък това прави Java динамичен тип език. Типът на променливата все още се извежда по време на компилация и не може да бъде променен по-късно.

3. Незаконно използване на var

Както бе споменато по-рано, var няма да работи без инициализатора:

var n; // error: cannot use 'var' on variable without initializer

Нито би работило, ако се инициализира с null :

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

Няма да работи за нелокални променливи:

public var = "hello"; // error: 'var' is not allowed here

Ламбда изразът се нуждае от явен целеви тип и следователно var не може да се използва:

var p = (String s) -> s.length() > 10; // error: lambda expression needs an explicit target-type

Същият е случаят с инициализатора на масив:

var arr = { 1, 2, 3 }; // error: array initializer needs an explicit target-type

4. Указания за използване на var

Има ситуации, при които var може да се използва законно, но може да не е добра идея да го направите.

Например в ситуации, когато кодът може да стане по-малко четим:

var result = obj.prcoess();

Тук, въпреки че е законно използване на var , става трудно да се разбере типа, върнат от процеса (), което прави кода по-малко четим.

java.netима специална статия за Указания за стил за локално променливо извеждане на тип в Java, която говори за това как трябва да използваме преценката, докато използваме тази функция.

Another situation where it's best to avoid var is in streams with long pipeline:

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

Usage of var may also give unexpected result.

For example, if we use it with the diamond operator introduced in Java 7:

var empList = new ArrayList();

The type of empListwill be ArrayListand not List. If we want it to be ArrayList, we will have to be explicit:

var empList = new ArrayList();

Using var with non-denotable types could cause unexpected error.

For example, if we use var with the anonymous class instance:

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

Now, if we try to assign another Objectto obj, we would get a compilation error:

obj = new Object(); // error: Object cannot be converted to 

Това е така, защото изведеният тип obj не е Object .

5. Заключение

В тази статия видяхме новата функция за извеждане на локален тип променлива Java 10 с примери.

Както обикновено, кодови фрагменти могат да бъдат намерени в GitHub.

Напред » Подобрения в производителността на Java 10