Что такое ключевое слово `var` в Java и из чего состоит его объявление?

Ответ

var — это ключевое слово для объявления локальных переменных с выводом типа, добавленное в Java 10. Компилятор сам определяет тип переменной на основе инициализирующего выражения.

Структура объявления var:

var variableName = initializerExpression;
  • var — ключевое слово.
  • variableName — имя переменной.
  • = — оператор присваивания.
  • initializerExpression — выражение, тип которого будет выведен для переменной.

Примеры:

var list = new ArrayList<String>(); // Тип: ArrayList<String>
var message = "Hello, World!";     // Тип: String
var stream = list.stream();         // Тип: Stream<String>
var entry = Map.entry("key", 42);  // Тип: Map.Entry<String, Integer>

Важные ограничения и правила:

  • Только для локальных переменных. Нельзя использовать для полей класса, параметров методов или возвращаемых типов.
  • Обязательная инициализация. var x; — ошибка компиляции.
  • Нельзя инициализировать null без явного указания типа (например, через приведение).
  • Не является ключевым словом в стиле JavaScript. Тип выводится один раз при компиляции и не может быть изменен.
  • Имя var нельзя использовать как идентификатор.

Почему var? Уменьшает шаблонный код, улучшает читаемость при очевидных типах (например, с дженериками).

Ответ 18+ 🔞

А, ну вот, наконец-то до нас, джавистов, дошло, блядь! Сидели, смотрели на C#, на Kotlin, на всех этих выскочек, а сами с List<Map.Entry<String, List<Integer>>> в каждой строчке жили. Как будто без этого длиннющего пиздеца компилятор нихуя не понимал, что мы хотим.

Так вот, var — это, грубо говоря, волшебное слово «угадай сам». Ты говоришь компилятору: «Слушай, дружище, вот тут я создаю какую-то хуйню. Сам посмотри на правую часть от «равно» и сообрази, какого она типа. А я, ленивая жопа, писать это всё не буду».

Как это выглядит, блядь:

var list = new ArrayList<String>(); // И он понимает, что это ArrayList<String>, ёпта!
var message = "Hello, World!";     // О, боже, это же String! Ни хуя себе открытие!
var stream = list.stream();         // Stream<String>, Карл! Не надо мне это писать!
var entry = Map.entry("key", 42);  // Map.Entry<String, Integer>... овердохуища букв сэкономил.

Но, как всегда, наша радость ограничена кучей правил, чтобы мы, дураки, себе ноги не прострелили. Запоминай:

  • Только для своих, внутри методов. Это как домашние тапочки. Не выноси за порог. Нельзя воткнуть var в поля класса, в аргументы метода или вместо возвращаемого типа. Только локальные переменные, сука!
  • Сразу говори, что даёшь. var x; — это пиздец, а не объявление. Компилятор тебе: «Чё даёшь-то? Воздух?». Инициализация обязательна, прямо в этой же строчке.
  • null — не аргумент. var shit = null; — не прокатит. Компилятор охуеет и спросит: «А null какого, блядь, типа?». Придётся явно кастовать, если уж очень надо.
  • Это не JavaScript, ёпта! Тип выводится один раз и навсегда при компиляции. var a = 10; a = "строка"; — получишь пиздюлей от компилятора. Это не динамическая типизация, а просто сахар синтаксический.
  • Освободи имя. Теперь var — слово зарезервированное. Не называй так свою переменную, класс или собаку.

А нахуя это всё? Да чтобы глаза не ебало, когда читаешь очевидные вещи! Особенно когда дженерики в дженериках, как матрёшки. Читабельность, блядь, повышается. Но злоупотреблять — себя не уважать. Если из правой части непонятно, что за тип, лучше написать явно, а то потом сам через месяц на свой код посмотришь и воскликнешь: «И чё это за var такой, блядь?».