Получить доступ

Что верно про var (Java 10)?

JuniorСовременная JavaJava >=10
Ещё спрашивают так:
  • Что такое var в Java?
  • Делает ли var Java динамически типизированной?
  • Где нельзя использовать var?
  • Когда var делает код лучше, а когда хуже? Расскажи, как он устроен и где ограничен.
Коротко

var — статический вывод типа компилятором из инициализатора; тип фиксируется при компиляции, динамики нет.

  • Только локальные переменные с инициализатором (и переменные циклов, параметры лямбд)
  • Нельзя: поля, параметры методов, возвращаемый тип, без значения, = null

А ещё Уместен, когда тип очевиден из правой части; вреден, когда скрывает его

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

var появился в Java 10. Компилятор смотрит на выражение справа и подставляет его тип, как если бы вы написали его руками. После этого тип не меняется: var x = 1; x = "a"; не скомпилируется. Это не динамическая типизация, как в JavaScript или Python, — просто меньше шума в коде.

Где работает: локальные переменные с инициализатором, переменные в for и for-each, параметры лямбд (с Java 11, удобно для аннотаций).

Где нельзя: поля класса, параметры методов, возвращаемые значения, объявление без инициализатора, инициализация null, лямбда без целевого типа, массив через {1, 2}.

Тонкость: var list = new ArrayList<>(); выведет ArrayList<Object> — ромбовидный оператор без типа даёт Object. И var выводит конкретный тип справа (ArrayList), а не интерфейс (List).

Рекомендация — использовать, когда тип очевиден: var users = new HashMap<String, List<User>>(). Если справа вызов метода с неочевидным результатом — лучше указать тип явно.

Пример

var users = new HashMap<String, List<User>>(); // тип очевиден
for (var entry : users.entrySet()) { ... }

var x = 10;
// x = "text";   // ошибка: тип x — int
// var y;        // ошибка: нет инициализатора

Что хотят услышать

  • var — статический вывод типа, а не динамическая типизация.
  • Где можно и где нельзя использовать.
  • Ловушка с new ArrayList<>() — плюс.
  • Когда var улучшает читаемость, а когда ухудшает.

Частые ошибки

  • Считать var динамической типизацией.
  • Пытаться применить var к полю/параметру.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Это статический вывод типа компилятором (не динамическая типизация); работает только для локальных переменных с инициализатором
  • ✗Это динамическая типизация, как в JavaScript
  • ✗var можно использовать для полей и параметров методов
  • ✗Переменная var может менять тип во время выполнения

Что спросят дальше

  • Когда var ухудшает читаемость?
  • Можно ли var без инициализатора?
  • Что выведет var для литерала 1 и для 1L?
  • Почему var нельзя использовать для полей класса?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем