JavaRush /Курси /Java Syntax Zero /Забезпечення сумісності в Java

Забезпечення сумісності в Java

Java Syntax Zero
Рівень 17 , Лекція 1
Відкрита

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

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

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

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

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

Цікаво

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

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

Назва Рік випуску Кількість класів
JDK 1.0 1996 211
JDK 1.1 1997 477
J2SE 1.2 1998 1,524
J2SE 1.3 2000 1,840
J2SE 1.4 2002 2,723
J2SE 5.0 2004 3,279
Java SE 6 2006 3,793
Java SE 7 2011 4,024
Java SE 8 2014 4,240
Java SE 9 2017 6,005
Java SE 10 2018 6,002
Java SE 11 2018 4,411
Java SE 12 2019 4,433
Java SE 13 2019 4,515

Хоча версії 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 (перерахування) — ще одне приємне нововведення. Його використання дозволяє красиво спрощувати багато моментів.

Це не всі нововведення: були ще сотні нових класів, але головне в тому, що це були дуже правильні нововведення, і вони дали ще один потужний поштовх популярності 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, у якій повернули половину того, що було видалено у Window 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 дата = new Date();
int день = дата.getDay();

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

Коментарі (2)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
oleh ronin Рівень 47
8 листопада 2023

Java SE 10	2018	6002 класів!
Java SE 11	2018	4411 класів!
це забезпечується завдяки тому, що нові методи, класи й пакети тільки додаються, але нічого не видаляється. щось я не зрозумів...
Sava_crosava Рівень 23
26 жовтня 2023
Інформативно)