1. Ключевое слово var
Когда мы только начинаем писать код на Java, нас встречает строгая система типов: каждую переменную нужно явно объявлять — указать её тип. Это полезно для надёжности, но иногда записи становятся громоздкими и перегружают код. Чтобы сделать жизнь проще, в Java добавили удобный инструмент — автовыведение типа (var).
var позволяет писать более короткий и чистый код, не жертвуя безопасностью типов: вы пишете значение, а компилятор сам выводит тип.
Пример
var age = 23; // компилятор определит тип числа 23 и подставит int age
var name = "Анна"; // компилятор определит тип "Анна" и подставит String name
var price = 99.99; // компилятор определит тип 99.99 и подставит double price
Почему появился var?
- Читабельность: не нужно писать длинные типы (вроде HashMap<String, List<Integer>>) вручную.
- Гибкость: позволяет легче менять типы в будущем: исправили справа — слева var уже подстроится.
- Современный стиль: практически все современные Java‑проекты используют var там, где тип легко читается из инициализации.
Когда можно (и нужно) использовать var
- Когда справа однозначно видно, какой тип у переменной.
- Когда тип очевиден (var price = 100; — ясно, что это int).
- Когда тип слишком длинный или сложный (например, HashMap<Integer, List<Calendar>>).
Пример с массивом
var numbers = new int[] { 1, 2, 3, 4 };
Пример с методом
var input = console.nextLine(); // input — это String (метод возвращает String)
Когда лучше НЕ использовать var
Если тип неочевиден по правой части, код может стать менее понятным. Если через месяц вы сами не поймёте, что там за тип, лучше явно указать.
var mystery = DoSomethingVeryComplicated(); // КТО ТЫ, mystery???
Здесь лучше явно указать тип:
String result = DoSomethingVeryComplicated();
Золотое правило: используйте var только там, где он не ухудшает читаемость!
var — только для локальных переменных
Ключевое слово var работает только для локальных переменных — внутри методов. Нельзя использовать var для:
- параметров метода;
- полей класса;
- констант.
Как работает var "под капотом"
- Компилятор Java при компиляции подставляет правильный тип.
- После компиляции никакого var не остаётся.
- Нет потери производительности: это удобство только для программиста.
var year = 2025; // на этапе компиляции становится: int year = 2025;
Типичные ошибки при использовании var
Неинициализированная переменная:
var a; // ОШИБКА: Компилятору не из чего вывести тип!
Неоднозначная инициализация:
var list = null; // ОШИБКА: Тип null не определён!
Переиспользование переменной с разными типами:
var value = 5; // value — int
value = "Пять"; // ОШИБКА: value уже int!
Сравнение: явные типы и var
| Сценарий | Явный тип | var |
|---|---|---|
| Тип однозначен | |
|
| Метод возвращает сложный тип | |
|
| Массив | |
|
2. Ключевое слово final: объявление констант
Константа — это переменная, значение которой нельзя изменить после инициализации. Константы делают код надёжным, понятным и защищают от случайных изменений важных чисел и строк.
- Число Пи (PI = 3.14159…)
- Максимальное количество пользователей (MAX_USERS = 1000)
- Название компании (COMPANY_NAME = "JavaRush")
В Java для объявления константы используется модификатор final. Он говорит компилятору: «после первого присваивания — больше менять нельзя!»
final Тип ИМЯ_КОНСТАНТЫ = значение;
Синтаксис
final int DAYS_IN_WEEK = 7;
final double PI = 3.1415926535;
final String GREETING = "Привет, Java!";
Важные моменты:
- Переменная с final должна быть инициализирована (сразу или в конструкторе — если это поле класса).
- Попытка изменить значение приведёт к ошибке компиляции.
Пример: нельзя изменить final переменную
final int MAX_USERS = 100;
MAX_USERS = 200; // Ошибка: нельзя присвоить новое значение final переменной
Комментарий: если раскомментировать присваивание — проект не соберётся.
3. static final: константы на уровне класса
В Java часто нужны константы, не зависящие от конкретного объекта, — «общие» для всего класса. Для этого используют связку static + final.
Почему static final?
- static — переменная принадлежит классу (одна на всех).
- final — значение нельзя изменить.
Синтаксис
public static final double PI = 3.1415926535;
public static final int MAX_USERS = 1000;
public static final String COMPANY_NAME = "JavaRush";
Где объявлять? Обычно — в начале класса (до методов).
Пример использования в классе
public class MathUtils
{
public static final double PI = 3.1415926535;
public static double circleLength(double radius)
{
return 2 * PI * radius;
}
}
Вызов:
double len = MathUtils.circleLength(5);
System.out.println(len); // 31.4159...
Обратите внимание: к константе обращаемся через имя класса: MathUtils.PI.
4. Отличие между просто final и static final
final — значение поля нельзя изменить после инициализации, но у каждого объекта своё значение.
static final — одна константа на весь класс, не зависит от объектов.
Пример: разница на практике
public class User
{
public final String name; // У каждого User своё имя (final)
public static final String COMPANY = "JavaRush"; // Одна компания на всех (static final)
public User(String name)
{
this.name = name;
}
}
User u1 = new User("Вася");
User u2 = new User("Петя");
System.out.println(u1.name); // Вася
System.out.println(u2.name); // Петя
System.out.println(User.COMPANY); // JavaRush
Вывод: name — индивидуальное неизменяемое поле, COMPANY — общая константа.
Соглашения по именованию констант
Константы принято называть ЗАГЛАВНЫМИ_БУКВАМИ_С_ПОДЧЁРКИВАНИЕМ.
public static final int MAX_USERS = 1000;
public static final double GRAVITY = 9.81;
public static final String DEFAULT_GREETING = "Hello, world!";
Совет: увидели подобное имя — не пытайтесь менять значение в коде: компилятор не позволит.
5. Практика: объявление и использование констант
Пример: класс с константами
public class CircleCalculator
{
public static final double PI = 3.1415926535;
public static double getLength(double radius)
{
return 2 * PI * radius;
}
public static double getArea(double radius)
{
return PI * radius * radius;
}
}
Использование:
public class Main
{
public static void main(String[] args)
{
double r = 5.0;
System.out.println("Длина окружности: " + CircleCalculator.getLength(r));
System.out.println("Площадь круга: " + CircleCalculator.getArea(r));
}
}
Результат:
Длина окружности: 31.415926535
Площадь круга: 78.5398163375
Попытка изменить константу
CircleCalculator.PI = 3.14; // Ошибка компиляции: cannot assign a value to final variable PI
6. Особенности и нюансы
Константы для объектов
Можно объявлять final для ссылок на объекты, но это не делает объект неизменяемым! Это лишь запрещает присваивать переменной другую ссылку.
final StringBuilder sb = new StringBuilder("Hello");
sb = new StringBuilder("World"); // Ошибка: нельзя присвоить новый объект
sb.append(", Java!"); // Разрешено — меняется состояние объекта
System.out.println(sb); // Hello, Java!
Вывод: final защищает ссылку, а не объект. Для настоящей неизменяемости используйте неизменяемые классы (например, String, List.of() и т. п.).
Использование констант против «магических чисел»
Плохой стиль:
double area = 3.1415 * r * r; // Что за 3.1415? Почему именно это число?
Хороший стиль:
double area = PI * r * r; // Сразу понятно, что используется число Пи
7. Типичные ошибки при работе с константами и var
Ошибка №1: попытка изменить значение final переменной. Если переменная объявлена с final, повторное присваивание приведёт к ошибке компиляции.
Ошибка №2: попытка объявить константу через var. Для констант всегда используйте явный тип вместе с final или static final. var — только для локальных переменных.
Ошибка №3: неправильное именование констант. Константы должны быть ЗАГЛАВНЫМИ_БУКВАМИ_С_ПОДЧЁРКИВАНИЕМ. Запись вроде final int maxUsers = 100; ухудшает читаемость.
Ошибка №4: забыли про область видимости. Константа, объявленная внутри метода, видна только в нём. Для использования по всему классу объявляйте на уровне класса как static final.
Ошибка №5: считать, что final делает объект неизменяемым. final фиксирует ссылку, а не состояние объекта — это разные вещи.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ