В чем разница между использованием var и явным указанием типа в Java
Что проверяют
Знаете ли вы, что var это вывод типа при компиляции, а не динамическая типизация, и где у него границы. Следом часто спрашивают, какой тип получится у var list = new ArrayList<>() и влияет ли var на производительность.
Как отвечать
var появился в Java 10 (JEP 286), в Java 11 его разрешили в параметрах лямбд. Компилятор выводит тип из инициализатора, и в байткоде переменная имеет обычный конкретный тип. Поэтому на скорость var не влияет, разница только в исходнике.
- где можно: локальные переменные с инициализатором, переменная в
forи enhanced for, ресурсы вtry-with-resources, параметры лямбд (удобно, чтобы повесить аннотацию:(@NonNull var x) -> ...); - где нельзя: поля, параметры методов, возвращаемые типы, объявление без инициализатора,
var x = null, инициализатор массива{1, 2}, лямбда без целевого типа; - что выводится: самый конкретный тип выражения.
var list = new ArrayList<String>()даётArrayList<String>, а неList<String>, и программирование через интерфейс теряется. С пустым diamond получитсяArrayList<Object>; - статус слова:
varэто reserved type name, а не ключевое слово. Переменная или метод с именемvarпо-прежнему компилируются, запрещено только назвать так тип.
Рабочее правило из рекомендаций OpenJDK по стилю: var уместен, когда тип очевиден из правой части (new, фабрика с говорящим именем) или громоздок, как Map.Entry<String, List<Order>> в цикле. Если справа вызов вроде service.process(), явный тип читается лучше, и на ревью это решается соглашением команды.
Где спотыкаются
Называют var динамической типизацией, как в JavaScript. Тип фиксируется при компиляции, и присвоить строку переменной var n = 10 нельзя.
Не замечают, что вывелось. var x = 1 даёт int, хотя человек рассчитывал на long, и строка x = 5_000_000_000L уже не скомпилируется. С diamond без аргумента молча получается Object в параметре типа.
Говорят, что var медленнее или меняет байткод. Разницы в рантайме нет, спор идёт только о читаемости, и сильный ответ заканчивается правилом, когда вы сами его используете.