Использование var в джаве

Что не так с выведением типов var в джаве? Коллега спросил, для чего я часто использую var, и не отголоски ли это джаваскрипта с динамической типизацией.

А у меня это отголоски выведения типов auto в C++. Стоит ли на проектах с джавой использовать var вместо явного указания типов? В чем плюсы и минусы? Вы используете var?


Ответы (2 шт):

Автор решения: Denis Lebedev

Компилятор выводит тип на основе значения, которое присваивают переменной. Но этим не стоит злоупотреблять.

Случаи, в которых, можно уместно использовать var:

  • Можно легко определить тип переменной, посмотрев, на присваиваемое значение:

    var stream = url.getInputStream();
    var name = person.getFullName();
    
  • Тип переменной не важен для понимания кода:

    for(var tmp : list) 
      System.out.println(tmp);
    
→ Ссылка
Автор решения: Зонтик

Чтобы понять var, предлагаю вспомнить что-нибудь похожее — например, вывод типа (англ. type inference), который появился в 7 Jav'е:

SomeGenericClass<Integer> = new SomeGenericClass<>();

Это же никакая не динамическая типизация, верно? Тип во вторых угловых скобках очевиден. И поэтому его не надо указывать дважды.

При создании объектов тип пишется тоже два раза. И если название класса длинное, то это может быть неудобно:

JFormattedTextField textField = new JFormattedTextField();

Поэтому первое объявление типа можно заменить на var (если это локальная переменная, конечно!). И получится кратко и понятно:

var textField = new JFormattedTextField();

Компилятор прекрасно поймёт, что должно быть вместо var.

Но тут главное не переусердствовать с новинкой и не понаписать непонятных var'ов. Антипример:

//comboBox = javax.swing.JComboBox
var item = comboBox.getItemAt(3);

В качестве item'а может быть вообще что угодно, класс JComboBox параметризованный, а метод getItemAt() возвращает E. Придётся смотреть, как этот объект был объявлен, с каким типом данных он работает...

→ Ссылка