1. Історія версій Java

Історія Java починається в 1991 році, коли група програмістів компанії Sun вирішила створити мову для маленьких пристроїв: телевізійних пультів, кавоварок, тостерів, банківських карток тощо.

Виробники таких пристроїв використовували дуже різні процесори для контролерів своїх виробів, тому було вкрай важливо не прив'язуватися до архітектури конкретного процесора або ОС.

Автори Java вирішили розділити проблему на дві частини: їхні програми компілюватимуться не в машинний код конкретного контролера, а в спеціальний проміжний код. Його, своєю чергою, виконуватиме спеціальна програма — віртуальна машина.

Більшість програмістів називають комп'ютер машиною.

Цікаво

За основу мову Java взяли мову C++, яку значно спростили й стандартизували. Якщо в С++ щось можна було зробити десятьма способами, то в Java залишили тільки один. Це чимось нагадувало перехід від ієрогліфів до алфавіту.

Першу версію Java випустили 1996 року. Відтоді Java почала свою переможну ходу по всьому світу, що зі свого боку стимулювало розвиток самої мови. Наразі мовою Java написано мільйони бібліотек і мільярди рядків коду, а нові версії Java виходять кожні 6 місяців:

Назва Рік випуску Кількість класів
JDK 1.0 1996 211
JDK 1.1 1997 477
J2SE 1.2 1998 1524
J2SE 1.3 2000 1840
J2SE 1.4 2002 2723
J2SE 5.0 2004 3279
Java SE 6 2006 3793
Java SE 7 2011 4024
Java SE 8 2014 4240
Java SE 9 2017 6005
Java SE 10 2018 6002
Java SE 11 2018 4411
Java SE 12 2019 4433
Java SE 13 2019 4515

Хоча версії Java виходили регулярно, з погляду програмістів, вони мали різну значимість: Java розвивалася стрибкоподібно.


2. Java 2

Перший стрибок відбувся з виходом версії JDK 1.2. Там було настільки багато нововведень, що автори Java перейменували цей реліз у Java 2 Platform Standard Edition або скорочено J2SE 1.2.

Основними нововведеннями були:

  • Ключове слово strictfp
  • Бібліотека Swing для роботи з графікою
  • JIT-компілятор, який прискорював роботу Java-програм
  • Великий набір колекцій
  • Повна підтримка Unicode: японська, китайська та корейська мови.

Сьогодні ці нововведення не здаються такими вже й значними, але будь-який великий проєкт виростає з маленького. Java не була б настільки популярною сьогодні, якби 20 років тому маленька група програмістів не продовжувала покращувати мову.


3. Java 5

Версія JDK 1.5 вийшла у вересні 2004 року. У ній також було чимало нововведень, отож без чергового перейменування не обійшлося: замість версій 1.5, 1.6, 1.7 вирішили використовувати 5.0, 6.0, 7.0. Тому повна назва JDK 1.5 стала звучати як Java 2 Standard Edition 5.0.

До цього оновлення ввійшли речі, без яких подальший розвиток мови був би неможливим.

Анотації. На використанні анотацій побудовано половину сучасних фреймворків, починаючи з таких величезних, як Spring або Hibernate, і закінчуючи JUnit.

Узагальнення. Узагальнення (Generics) додали потужності колекціям (та й не тільки колекціям). Код став простішим, компактнішим і безпечнішим.

Autoboxing/Unboxing — автоматичне перетворення між примітивними типами та їхніми «близнюками» — класами-обгортками. Це значно спростило написання й читання коду, а також підвищило й без того велику популярність колекцій.

Цикл foreach зараз становить щонайменше половину всіх циклів, які пишуть програмісти. І, звичайно, він незамінний для роботи з колекціями.

Enum (enumeration) — ще одне приємне нововведення. Завдяки йому можна красиво спрощувати чимало моментів.

Це не всі нововведення: запровадили ще сотні нових класів, але головне, що то були дуже правильні нововведення, які дали ще один потужний поштовх популярності Java.


4. Java 6

Java 6 запам'яталася великою кількістю невеличких поліпшень і відмовою від цифри 2 в назві: тепер це була не Java 2 Standard Edition 6.0, а просто Java Standard Edition 6.0.

От деякі цікаві нововведення.

Java Compiler API дав змогу викликати Java-компілятор безпосередньо з коду. Тепер ваша програма могла згенерувати код класу у вигляді тексту, скомпілювати його, викликавши методи Java Compiler API, і відразу почати виклик методів скомпільованого класу. Є цілі напрями розробки, де така річ дуже сильно спрощувала життя.

JavaScript стало можливим виконувати прямо всередині програми, написаної мовою Java. Ця можливість з'явилася завдяки тому, що в JavaSE 6 було вбудовано JavaScript-рушій Rhino.


5. Java 7

У липні 2011 року вийшла Java 7. У ній мало бути багато поліпшень, але програмісти встигли додати лише невелику частину з запланованого. Нижче перелічено основні нововведення.

Нова бібліотека для роботи із введенням і виведенням даних. Вона так і називається — New Input Output API — і міститься в пакеті java.nio.

Автоматичне виведення типів Java-компілятором на етапі компіляції дало програмістам змогу писати менше коду. Компілятор став розумнішим, і це був тільки початок.

У switch стало можливим використовувати рядки як значення.

Також було суттєво покращено процес автоматичного керування ресурсами: Java-програма сама закриває потоки даних, коли вони стають непотрібними, за допомогою try-with-resources.

Було ще багато різних змін, але вони не такі важливі в контексті нашого поточного процесу вивчення Java.


6. Java 8

Java 8 вийшла в березні 2014 року й була найзначнішим останнім оновленням Java.

Програмістам вона запам'яталася насамперед доданням у Java лямбда-виразів і функціональних інтерфейсів: анотація @FunctionalInterface. Ми розглядатимемо їх на 21-му рівні. Ваш код уже ніколи не буде таким, як колись.

Також було додано Stream (потоки) для колекцій, і в поєднанні з лямбда-виразами потоки дали змогу писати код набагато стисліше. Хоча й не завжди він був читабельнішим.

Поява потоків — stream — завдала ще одного удару по любителях називати нитки (threads) потоками. Наразі, аби уникнути плутанини, дехто з україномовних програмістів називає нитки тредами (thread), але слова «багатопотоковість» поки не позбулися.

Цікаво

І третя значна зміна: у Java 8 з'явився цілий новий API для роботи з датою та часом — Date Time API. Ми його вивчатимемо найближчим часом.


7. Java 9

Реліз Java 9 відбувся у вересні 2017 року. З того моменту розробники Java вирішили випускати нові версії частіше — кожні пів року. Найімовірніше, їх уразив підхід розробників браузера Google Chrome.

Реліз Java 9 торкнувся здебільшого внутрішньої будови Java-машини. Найзначніше з того, що він приніс пересічним програмістам, — можливість поділяти програму на модулі. Це дуже зручно, коли у вашому коді десятки тисяч класів або динамічно вивантажувані плагіни.

Але, напевно, найближчим часом нам це навряд чи знадобиться.


8. Java 11

Через пів року після виходу Java 9 вийшла Java 10, а ще пів року потому — Java 11.

За цей час з'явилася купа дрібних поліпшень, але, найімовірніше, ви запам'ятаєте тільки два.

Додано підтримку Unicode 10. Тепер у своїх Java-програмах ви можете використовувати emoji (емодзі). Працювати з ними можна так само, як і з будь-якими іншими символами — вони просто частина Unicode.

Крім того, було покращено виведення типів і з'явилося ключове слово var — це вам точно сподобається.

Тепер можна писати отак:

var str = "Привіт";

А компілятор перетворить це на

String str = "Привіт";

Проте не обійшлося без втрат. Розробники Java вилучили з JDK 11 такі бібліотеки, як JavaFX, Java EE та CORBA.


9. Важливість сумісності

Дуже часто після випуску нової версії програмісти хочуть почати все з чистого аркуша. Ну кому захочеться виправляти купу старих помилок, коли тепер точно впевнений, як треба було робити із самого початку?

Натомість історія проти такого підходу. Щоразу, коли програмісти випускають нову версію програми, 90 % її користувачів — це користувачі старої версії. Вони можуть користуватися новими функціями програми чи ігнорувати їх, але всі вони ненавидять ситуації, коли більше не працює те, що раніше чудово працювало.

Багато гарних продуктів пропало, коли програмісти випустили нові несумісні версії або просто внесли кардинальні зміни. Та сама Windows 8 з її ідеєю відмови від кнопки «Пуск» не сподобалася користувачам. Довелося випускати версію Windows 10, в якій повернули половину того, що було видалено у Windows 8.

З іншого боку, зараз ви можете запустити у Windows програму, написану 20 років тому під Windows 95 або 30 років тому під MS DOS 3.0, і вона працюватиме. Це одна з причин, чому ОС Windows залишається популярною.

Java теж не була б такою популярною, якби її розробники не турбувалися про сумісність. Щоразу після виходу нової версії Java-машини, нової версії SDK, внесення суттєвих змін у класи весь Java-код, написаний із січня 1996 року, продовжує працювати.

Зазвичай це забезпечується завдяки тому, що нові методи, класи й пакети тільки додаються, але нічого не видаляється. Такий підхід має свої плюси й мінуси.

З одного боку, Java тягне із собою купу баласту у вигляді старого, неоптимального й непотрібного коду, а з іншого — ви завжди можете додати у свій проєкт, написаний мовою Java 11, бібліотеку, яку було написано мовою Java 8 і яка використовує бібліотеки, написані мовами Java 5 і Java 2. І вся ця збірна солянка чудово працюватиме.

У випадку з мовою C++ ви не можете в одному проєкті використовувати бібліотеки, скомпільовані під 32-розрядну й під 64-розрядну платформи. І на рівному місці отримаєте сильний головний біль, якщо одна бібліотека використовує тип char довжиною в один байт, а друга — у два байти.


10. Deprecated

Отже, автори Java вирішили нічого не видаляти, а лише додавати нові класи й пакети. А як сповістити програмістів про те, що з'явилася гідна альтернатива наявному неоптимальному рішенню?

Для цього придумали анотацію @Deprecated.

Якщо якийсь метод або клас застарівав, поруч із його оголошенням прописували цю інструкцію. Це означає, що програмістам не рекомендується використовувати цей програмний елемент.

Ви, як і раніше, можете використовувати цей клас і/або метод, але це не рекомендовано.

І як часто люди роблять те, що не рекомендовано? Майже завжди 🙂

Багато класів уже протягом 20 років перебувають у стані deprecated, а їх і досі використовують. Звикли, або просто зручно. Хоча ризик, що їх коли-небудь видалять, все-таки існує, отож краще так не робити.

Усі сучасні IDE, зокрема Intellij IDEA, вміють обробляти анотацію @Deprecated. Застарілі класи й методи відображаються з перекресленим ім'ям. Приблизно так:

Date date = new Date();
int day = date.getDay();

Застарілі класи бувають дуже популярними й часто зустрічаються в будь-якому коді, тому деякі з них ми розглянемо найближчим часом.