Рубрики
Без рубрики

Java 10 Вывод типа локальной Переменной

Краткое и практическое руководство по выводу типа локальной переменной Java 10.

Автор оригинала: Ganesh Pagade.

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);
}

Мы не предоставляем тип данных сообщение . Вместо этого мы отмечаем сообщение как вар , и компилятор выводит тип сообщение от типа инициализатора, присутствующего в правой части.

В приведенном выше примере тип message будет String .

Обратите внимание, что эта функция доступна только для локальных переменных с инициализатором. Его нельзя использовать для переменных – членов, параметров метода, типов возвращаемых значений и т. Д.-Требуется инициализатор, без которого компилятор не сможет определить тип.

Это улучшение помогает уменьшить шаблонный код; например:

Map map = new HashMap<>();

Теперь это можно переписать как:

var idToNameMap = new HashMap();

Это также помогает сосредоточиться на имени переменной, а не на типе переменной.

Еще следует отметить, что var не является ключевым словом – это обеспечивает обратную совместимость для программ, использующих var , скажем, в качестве имени функции или переменной. var – это зарезервированное имя типа, как и int .

Наконец, обратите внимание, что при использовании var нет никаких накладных расходов во время выполнения, и это не делает Java динамически типизированным языком. Тип переменной по-прежнему выводится во время компиляции и не может быть изменен позже.

3. Незаконное использование различных

Как упоминалось ранее, 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 result = obj.prcoess();

Здесь, несмотря на законное использование var , становится трудно понять тип, возвращаемый process () , создающим код

Здесь, несмотря на законное использование var , становится трудно понять тип, возвращаемый process ()

Здесь, несмотря на законное использование var , становится трудно понять тип, возвращаемый

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

Здесь, несмотря на законное использование var , становится трудно понять тип, возвращаемый

Например, если мы используем его с оператором diamond, введенным в Java 7:

var empList = new ArrayList<>();

Тип empList будет ArrayList , а не List . Если мы хотим , чтобы это был ArrayList , мы должны быть явными:

var empList = new ArrayList();

С помощью вар с не обозначаемыми типами может привести к неожиданной ошибке.

Например, если мы используем var с экземпляром анонимного класса:

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

Теперь, если мы попытаемся назначить другой Объект объекту , мы получим ошибку компиляции:

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

Это происходит потому, что предполагаемый тип obj не является Object .

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

В этой статье мы увидели новую функцию вывода типа локальной переменной Java 10 с примерами.

Как обычно, фрагменты кода можно найти на GitHub .