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(); // Невідомий тип — незрозуміло, що повертає DoSomethingVeryComplicated()
Тут краще явно вказати тип:
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 = "Привіт, світ!";
Порада: побачили таке імʼя — не намагайтеся змінювати значення в коді: компілятор не дозволить.
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; // Помилка компіляції: неможливо присвоїти значення змінній, оголошеній як final
6. Особливості й нюанси
Константи для обʼєктів
Можна оголошувати final для посилань на обʼєкти, але це не робить обʼєкт незмінним! Це лише забороняє присвоювати змінній інше посилання.
final StringBuilder sb = new StringBuilder("Привіт");
sb = new StringBuilder("Світ"); // Помилка: не можна присвоїти новий обʼєкт
sb.append(", Java!"); // Дозволено — змінюється стан обʼєкта
System.out.println(sb); // Привіт, 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 фіксує посилання, а не стан обʼєкта — це різні речі.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ