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 (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, в которой вернули половину того, что было удалено в Window 8.

С другой стороны, сейчас в Windows вы можете запустить программу, написанную 20 лет назад под Windows 95 или 30 лет назад под MS DOS 3.0, и она будет работать. Это одна из причин, почему Windows остается популярной.

Java тоже не была бы столь популярной, если бы ее разработчики не заботились о совместимости. Каждый раз при выходе новой версии Java-машины, новой версии SDK, серьезных изменениях в классах, весь Java-код, написанный с января 1996 года, продолжает работать.

Обычно это достигается за счет того, что новые методы, классы и пакеты только добавляются, но ничего не удаляется. У этого подхода есть свои плюсы и минусы.

С одной стороны, Java тянет с собой кучу балласта в виде старого, неоптимального и ненужного кода, а с другой, вы всегда можете добавить в ваш проект, написанный на Java 11, библиотеку, которая написана на Java8 и использует библиотеки, написанные на 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();

Устаревшие классы бывают очень популярны и часто встречаются в любом коде, так что некоторые из них мы рассмотрим в ближайшее время.