Первоначальная версия Java не представляла собой ничего особенно революционного, но она и не ознаменовала завершение периода быстрого совершенствования этого языка. В отличие от большинства других систем программирования, совершенствование которых происходило понемногу и постепенно, язык Java продолжает стремительно развиваться. Вскоре после выпуска версии Java 1.0 разработчики уже создали версию Java 1.1. Внедренные в этой версии функциональные возможности оказались более значительными и существенными, чем можно было ожидать, судя по увеличению дополнительного номера версии. В новой версии разработчики добавили много новых библиотечных элементов, переопределили механизм обработки событий и изменили конфигурацию многих библиотечных средств из версии 1.0. Кроме того, они отказались от нескольких средств, первоначально определенных в Java 1.0, но признанных затем устаревшими. Таким образом, в версии Java 1.1 были внедрены новые характерные свойства и в то же время исключены некоторые свойства, определенные в первоначальной спецификации.
Следующей основной стала версия Java 2, где номер “2” означает второе поколение. Создание версии Java 2 стало знаменательным событием, означавшим начало “современной эпохи” Java. Первой версией java 2 был присвоен номер 1.2, что может показаться несколько странным. Дело в том, что вначале номер относился к внутреннему номеру версии библиотек Java, но затем он был распространен на всю версию в целом. С появлением версии java 2 компания Sun Microsystems начала выпускать программное обеспечение Java в виде пакета J2SE (Java 2 Platform Standard Edition — Стандартная версия платформы Java 2), и с тех пор номера версий стали присваиваться именно этому программному продукту.
В версии Java 2 была добавлена поддержка ряда новых средств, в том числе Swing
и Collections Framework
. Кроме того, были усовершенствованы виртуальная машина JVM и различные инструментальные средства программирования. В то же время версия Java 2 содержала некоторые не рекомендованные к употреблению средства. Наибольшие изменения претерпел класс Thread
, где методы suspend()
, resume()
и stop()
стали рекомендованными к употреблению в многопоточном программировании.
Версия J2SE 1.3 стала первой серьезной модернизацией первоначальной версии Java J2SE. Эта модернизация состояла, главным образом, в расширении существующих функциональных возможностей и “уплотнении” среды разработки. В общем случае программы, написанные для версий 1.2 и 1.3, совместимы по исходному коду. И хотя изменений в версии 1.3 оказалось меньше, чем в трех предшествующих основных версиях, это не сделало ее менее важной.
Совершенствование языка Java было продолжено в версии J2SE 1.4. Эта версия содержала несколько важных усовершенствований и добавлений. Например, в нее были добавлены новое ключевое слово assert, цепочки исключений и подсистема ввода-вывода на основе каналов. Изменения были внесены и в каркас Collections Framework, а также в классы, предназначенные для работы в сети. В эту версию было также внесено много мелких изменений. Несмотря на значительное количество новых функциональных возможностей, версия 1.4 почти полностью сохранила совместимость по исходному коду с предшествующими версиями.
В следующую версию Java, названную J2SE 5, был внесен ряд революционных изменений. В отличие от большинства предшествующих обновлений Java, которые предоставляли важные, но постепенные усовершенствования, в версии J2SE 5 была коренным образом расширена область, возможности и пределы применения языка. Чтобы стало понятнее, насколько существенными оказались изменения, внесенные в версии J2SE 5, ниже перечислены лишь самые основные из новых функциональных возможностей Java в данной версии.
- Обобщения.
- Аннотации.
- Автоупаковка и автораспаковка.
- Перечисления.
- Усовершенствованный цикл
for
в стилеfor each
. - Аргументы переменной длины (
varargs
). - Статический импорт.
- Форматированный ввод-вывод.
- Утилиты параллельной обработки.
В этом перечне не указаны незначительные изменения или постепенные усовершенствования. Каждый пункт перечня представлял значительное дополнение языка Java. Одни из них, в том числе обобщения, усовершенствованный цикл for и аргументы переменной длины, представляли новые синтаксические элементы, а другие, например автоупаковка и автораспаковка, изменяли семантику языка. Аннотации придали программированию совершенно новые черты. В любом случае влияние всех этих дополнений вышло за рамки их прямого действия. Они полностью изменили сам характер языка Java.
Значение новых функциональных возможностей нашло отражение в присвоенном данной версии номере — “5”. Если следовать привычной логике, то следующим номером версии java должен был быть 1.5. Однако новые средства оказались столь значительными, что переход от версии 1.4 к версии 1.5 не отражал бы масштабы внесенных изменений. Поэтому в компании Sun Microsystems решили присвоить новой версии номер 5, чтобы тем самым подчеркнуть значимость этого события. Поэтому версия данного программного продукта была названа J2SE 5, а комплект разработчика — JDK 5. Тем не менее для сохранения единообразия в компании Sun Microsystems решили использовать номер 1.5 в качестве внутреннего номера версии, называемого также номером версии разработки. Цифра 5 в обозначении версии называется номером версии продукта.
Следующая версия получила название Java SE 6. С выходом этой версии в компании Sun Microsystems решили в очередной раз изменить название платформы Java. В названии была опущена цифра 2. Таким образом, данная платформа теперь называется сокращенно Java SE, а официально — Java Platform, Standard Edition 6 (Платформа Java, стандартная версия 6). Комплект разработчика был назван JDK 6. Как и в обозначении версии J2SE 5, цифра 6 в названии Java SE 6 означает номер версии продукта. Внутренним номером разработки этой версии является 1.6.
Версия Java SE 6 была построена на основе версии J2SE 5 с рядом дальнейших усовершенствований. Она не содержала дополнений к числу основных языковых средств Java, но расширяла библиотеки API, добавляя несколько новых пакетов и предоставляя ряд усовершенствований в исполняющей системе. В этой версии было сделано еще несколько усовершенствований и внесено несколько дополнений. В целом версия Java SE 6 призвана закрепить достижения в J2SE 5.
Далее была выпущена версия Java SE 7 с комплектом разработчика Java JDK 7 и внутренним номером версии 1.7. Это был первый главный выпуск java с тех пор, как компания Sun Microsystems была приобретена компанией Oracle (этот процесс начался в апреле 2009 года и завершился в январе 2010 года). Версия Java SE 7 содержит много новых средств, включая существенные дополнения языка и библиотек Java API. В данной версии была усовершенствована исполняющая система Java, а также включена в нее поддержка других языков, кроме Java, но программирующих на Java больше интересовали дополнения, внесенные в сам язык и его библиотеку. Новые языковые средства были разработаны в рамках проекта Project Coin. Этот проект должен был обозначать многие, так называемые “мелкие” изменения в Java, которые предполагалось включить в JDK 7, хотя эффект от всех этих новых “мелких” новшеств весьма велик с точки зрения их воздействия на код. В действительности для большинства программистов эти изменения могут стать самым важным нововведением в Java SE 7. Ниже перечислены новые языковые средства, внедренные в JDK 7.
- Расширение типа String возможностями управлять ветвлением в операторе
switch
. - Двоичные целочисленные литералы.
- Символы подчеркивания в числовых литералах.
- Расширение оператора
try
, называемое оператором try с ресурсами, обеспечивающим автоматическое управление ресурсами. (Например, потоки ввода-вывода могут теперь быть закрыты автоматически, когда они больше не нужны.) - Выводимость типов (с помощью ромбовидного оператора
<>
) при создании обобщенного экземпляра. - Улучшенная обработка исключений, благодаря которой два исключения или больше могут быть обработаны в одном блоке оператора
catch
(многократный перехват), а также улучшенный контроль соответствия типов повторно генерируемых исключений. - Улучшение предупреждений компилятора, связанных с некоторыми типами методов с переменным количеством аргументов. И хотя это нельзя считать изменением в синтаксисе, оно дает больший контроль над предупреждениями.
Несмотря на то что средства, внедренные в рамках проекта Project Coin, считаются мелкими изменениями в языке Java, в целом они тем не менее дают много больше преимуществ, чем подразумевает само понятие “мелкие”. В частности, оператор try с ресурсами оказывает существенное влияние на порядок написания кода, опирающегося на потоки ввода-вывода. Кроме того, возможность использовать объекты типа String
в операторе switch
оказалась долгожданным усовершенствованием, позволившим во многом упростить код.
В версии Java SE 7 внесено несколько дополнений в библиотеку Java API. Важнейшими из них являются усовершенствования каркаса NIO Framework и дополнения каркаса Fork/Join Framework. Новая система ввода-вывода NIO (первоначально называвшаяся New I/O) была внедрена в версии Java 1.4. Но изменения, внесенные в версии Java SE 7, значительно расширили возможности этой системы, причем настолько, что она зачастую обозначается как N10.2.
Каркас Fork/Join Framework обеспечивает важную поддержку параллельного программирования. Термином параллельное программирование обычно обозначаются технологии, повышающие эффективность применения компьютеров с несколькими процессорами, включая многоядерные системы. Преимущества, которые дают многоядерные системы, позволяют в перспективе значительно повысить производительность программ. Каркас Fork/Join Framework
позволяет решать задачи параллельного программирования в следующих областях:
- упрощение составления И использования заданий, которые могут выполняться параллельно;
- автоматическое использование нескольких процессоров.
Следовательно, с помощью каркаса Fork/Join Framework можно создавать приложения, в которых автоматически используются процессоры, доступные в исполняющей среде. Разумеется, не все алгоритмы оказываются параллельными, но те из них, которые таковыми все же являются, позволяют добиться существенных преимуществ в скорости выполнения.