1. Синтаксичний цукор
Програмісти люблять, коли якийсь складний код або логіку можна написати парою рядків, і код при цьому компактний і читабельний. А розробники мов іноді допомагають їм у цьому.
Хитрі особливості мови, які дозволяють використовувати коротший шлях (писати менше коду), називають синтаксичним цукром. Хоча, чесно кажучи, в Java його зовсім небагато.
Розробники Java зробили все, щоб усунути з Java всю можливу надмірність. Якщо у C++ щось можна зробити десятьма способами, у Java найчастіше це можна зробити лише одним способом.
Але така уніфікація не подобається ні Java-програмістам, ні творцям Java. І іноді вони спрощують життя звичайним людям, таким як ми з вами.
До речі, ви вже познайомились із річчю, яку можна віднести до синтаксичного цукру — це autoboxing і unboxing. Порівняйте:
| Довгий код | Компактний код |
|---|---|
|
|
|
|
|
|
Замість довгого коду як зліва ви можете писати більш компактний код, як справа. А розумний Java-компілятор на основі короткого коду сам згенерує його повну версію. Це і є синтаксичний цукор.
2. Виведення типу змінної – var
У Java 11 компілятор став ще розумнішим і тепер може визначити тип створюваної змінної за типом значення, яке їй присвоюють. Виглядає це у коді так:
var ім'я = значення;
Де ім'я — це ім'я нової змінної, значення — її початкове значення, а var — це ключове слово, яке використовується для оголошення змінної. Тип у змінної ім'я буде такий самий, як у значення, яке їй присвоюють.
Приклади:
| Як цей код бачимо ми | Що бачить компілятор |
|---|---|
|
|
|
|
|
|
|
|
|
|
Компілятор сам визначає або, як ще кажуть, виводить тип змінної на основі значення, яке їй присвоюють.
Чимало суперечок було на тему того, чи варто додавати таку можливість у мову чи ні. Багато хто боявся, що використанням var почнуть зловживати, і читабельність коду сильно знизиться.
Частка істини в цьому є, тому краще за все використовувати var там, де це підвищує читабельність коду. Наприклад, у цих двох випадках:
Випадок 1: дивлячись на значення змінної, відразу зрозуміло, який тип у змінної
| Код | Пояснення |
|---|---|
|
У змінної тип InputStream |
|
У змінної тип String |
А ось у цих випадках використовувати var не варто. Ну-ка, скажіть, який тип у змінної?
| Код | Пояснення |
|---|---|
|
Тип змінної визначити складно |
|
Тип змінної визначити складно |
Випадок 2: тип змінної не важливий для розуміння коду
Часто у коді можуть бути ситуації, коли у змінної не викликаються ніякі методи – змінна просто використовується для тимчасового зберігання чогось. Використання var тут абсолютно не знижує розуміння коду:
| Довгий код | Компактний код |
|---|---|
|
Ми отримали метадані із потоку stream і зберегли їх у сховище storage. Який саме тип був у змінної data — не важливо. |
Золота середина
Зараз наведу три способи запису одного й того ж коду. Використання var буде оптимальним варіантом.
| Код | Примітка |
|---|---|
|
Занадто компактно |
|
Ідеально |
|
Занадто детально |
Коли ми перейшли від варіанту у рядку 1 до варіанту у рядку 2, ми за рахунок імені змінної (headerInfo) додали коду трохи читабельності. Тепер зрозуміло, що метод повертав не просто метаінформацію, а інформацію про заголовок.
Третій варіант був би надмірним. Ну й що, що headerInfo має тип FileMetaInfo — це й так було майже зрозуміло за методом getFileMetaInfo(). Набагато цікавіше призначення цієї метаінформації.
3. Опускання типу — оператор diamond: <>
Ще до появи оператора var були спроби навчити компілятор виводити типи колекцій. Погодьтесь, цей запис виглядає трохи надмірно:
ArrayList<String> list = new ArrayList<String>();
Починаючи з сьомої версії Java, під час запису типу колекції можна було опускати (не писати) тип елементів колекції, якщо він вказаний під час оголошення змінної. Тобто код вище можна записати трохи скорочено:
ArrayList<String> list = new ArrayList<>();
Як бачите, вдруге писати тип String більше не потрібно. Не так круто, як з оператором var, але свого часу і це здавалося досягненням.
Порожні трикутні дужки в типі колекції отримали назву оператор diamond: дві дужки віддалено нагадували силует діаманту.
Використовувати одночасно var і оператор diamond небажано:
var list = new ArrayList<>();
Інформація про тип, який зберігає колекція, зовсім не залишиться, і тип буде визначено як ArrayList<Object>.
4. Подвійні фігурні дужки
Пам’ятаєш швидку ініціалізацію масиву?
Ми там просто перелічували значення у фігурних дужках:
| Приклади |
|---|
|
|
Творцям Java сподобалася ідея використовувати фігурні дужки для спрощеного запису даних у масив. Але як бути з колекціями?
Для колекцій також вистачило фантазії: дозволили використовувати трюк із подвійними фігурними дужками.
| З цукром | Без цукру |
|---|---|
|
|
Якщо компілятор зустріне код у прикладі зліва, він перетворить його на код справа.
Код не стає значно компактнішим. Тут скоріше економія на дрібницях: не потрібно кожного разу писати list. Це може бути вигідно, якщо ім’я змінної дуже довге.
Але якщо ти зустрінеш у чиємусь проєкті такий код, не дивуйся 🙂
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ