Данная статья посвящена новой разработке компании SUN – JDK 5.0

Мы рассмотрим те особенности, которые разработчики посчитали ключевыми. Большинство (можно сказать даже, что практически вся) представленной информации читатель может найти на официальном сайте компании. Автор просто решил представить данные особенности на свой лад и снабдить некоторыми примерами.

Итак, какие особенности можно назвать революционными:

1. Generics – переводу в одно слово это понятие поддается с трудом. Можно дать приблизительно такую трактовку: «обобщенные характеристики всего класса».
В двух словах это выглядит так: раньше все, что программист помещал в классы Collection (Vector, List, Stack) имело тип Object. Если Вы получали элемент из Collection (например, типа String), то Вам необходимо было делать обязательно так:

Или если Вы хотели просмотреть всю коллекцию с помощью итератора, то раньше Вы делали так:

Заметьте, что тут есть два момента. Во-первых, необходимо привести тип элемента из коллекции к нужному виду. И, во-вторых, надо быть уверенным, что он действительно String. НИКАКИХ гарантий, что там окажется именно String, Вам не давалось. В любой момент в коллекцию можно было положить любой другой тип данных. И соответственно дальше все было делом либо доверия – там нет ничего кроме String, либо надо было убеждаться, что тип именно String.
Теперь у Вас может быть такая уверенность – Вы можете на этапе компиляции указать, какой тип Вы хотите хранить в коллекции. И уже на этапе компиляции Вам скажут, что Вы делаете что-то не то.

Чтобы было нечто более конкретное, напишем полноценный пример.

При внимательном просмотре текста Вы увидите, что, кроме того, что объявлена переменная Vector, объявление снабжено указанием типа данных, которые могут быть использованы в данной коллекции. Но если Вы удалите комментарий в строке 12 (//v.add(new Integer(1));), то программа уже на этапе компиляции выдаст ошибки. И если Вам действительно важно, чтобы в Вашей коллекции не было ничего кроме String, Вы можете быть уверены, что так оно и будет – компилятор следит за этим.

Давайте попробуем собрать такой же пример, но уже без указания класса.

Программа соберется, но Вы можете увидеть предупреждения компилятора

Давайте сделаем как просит компилятор и соберем еще раз с указанными ключом.

Мы увидим достаточно большое сообщение

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

На первый взгляд может показаться, что такое нововведение излишне утяжеляет язык, но на взгляд автора это хорошая идея. Во-первых, код становиться более надежным. Во-вторых, Вам никто не запрещает использовать коллекции так же, как и прежде без указания конкретного типа.

 

2. The For-Each Loop – улучшенный вариант цикла прохождения по коллекции.
Возьмем наш первый пример, в котором мы распечатали длины всех строк из коллекции. Нам интересен цикл

Теперь есть более упрощенный вариант такого цикла

В полном варианте наш пример будет выглядеть теперь вот так

Также можно поступить и с обычным массивом – распечатаем значения массива

 

3. Autoboxing/Unboxing – автоматическая упаковка в объект.
Давайте просто внимательно разберем пример

Заметьте, что в коллекцию можно вставлять объект типа Integer. И вообще в коллекцию можно было вставлять только наследников от Object. Т.е. раньше надо было писать

А также получение числа из объекта Integer тоже надо было делать приведением типа к Integer и вызовом метода intValue(). В цикле это происходит автоматически. Вот в принципе и весь смысл этого нововведения. Но удобно очень 🙂

 

4. Enums – перечисления.
Раньше для объявления констант использовалась такая форма:

Такое объявление имеет ряд недостатков, наиглавнейший из которых – не уникальность. Вам никто не мешает использовать одни и те же значения для разных констант. И теперь эта проблема решена.

Как видите теперь Вашему запутанному коду не удастся обмануть компилятор без Вашего соизволения 🙂

Казалось мелочь, но кроме того, что [b]enum[/b] может хранить константы, они могут иметь методы!!!
Мне очень понравился пример из оригинального текста, который показывает пример планет.

Теперь Вы можете использовать не только константы, но также делать для этих констант необходимые вычисления. Разве не замечательно.

Я специально ждал того момента, когда пытливый читатель обратит внимание на последнюю строку. Увидели?
Да, JAVA теперь имеет полноценный printf, который испокон веков был в языке Си/С++. Теперь он есть и в JAVA.

Но, как пытливый читатель заметил, такая форма printf подразумевает, что количество аргументов может быть переменным. Именно так.

 

5. Переменное количество аргументов в методе
В принципе здесь особо много говорить не стоит – проще посмотреть на пример.

 

6. Импорт статических переменных/констант
По большому счету это просто более удобный метод использования констант. Частенько бывает, что только ради какой-то константы приходится делать import ко всему классу. А бывает, что лениво перечислить классы и import вытаскивает полный пакет. Выглядит это не очень красиво. И потому теперь вы можете импортировать статическую и больше ничего. Насколько это удобно – даже не знаю что сказать.

Выглядит это так:

И теперь в другом пакете Выможете написать таким образом:

Вы можете использовать также все константы, которые описаны в Вашем классе. Вот как это выглядит:

 

7. Аннотация (метаданные)
Идея аннотации (мета-данных) предложена для того, чтобы в процессе работы программы Вы бы могли получить информацию не только о методах, классах и параметрах, но и какие-то дополнительные значения или параметры, которые могут дать дополнительную характеристику. Объем стаьи не позволяет растекаться «по древу», поэтому приведу просто пример, к которому будут даны объяснения.

Давайте потихонечку разберемся с нашей программой. Первая непонятка это строка, которая начинается с @Retention(…
Разработчики JDK 5.0 предложили следующий способ введения мета-данных:
Программист описывает структуру тех мета-данных, которые он будет использовать. Я ввел структуру, которая содержит всего одно поле – comment
Полная запись мета-данных выглядит так:

После введения мета-данных программист может использовать эти мета-данные где ему интересно. Понятно, что таких структур будет не одна, а много. Мы для примера взяли одну. Везде, где встречается @debug (кроме описания) мы видим, что в скобках указана пара «параметр=значение».
Очень важно отметить, что перед описанием структуры @debug стоит структура @Retention. Именно отсутствие этой записи заставило мучаться несколько часов автора статьи – все собиралось, но аннотация исчезала во время запуска. Этот параметр указывает, как следует обходиться с теми мета-данными, которые описаны после нее. Мы использовали параметр java.lang.annotation.RetentionPolicy.RUNTIME. Это значение говорит о том, что информация из мета-данных будет сохранена даже при запуске приложения. Другие значения (CLASS, SOURCE) говорят, что эта информация не будет доступна во время выполнения (смотрите JavaAPI for JDK 5.0).
А дальше все очень просто – мы использовали данную структуру для хранения информации для самого класса, параметра и метода.
В методе main мы по очереди попросили вернуть аннотации у самого класса, потом у метода и поля. Если Вы немного поиграете с данной программой, то поймете достаточно много.

Вот в принципе и все наиболее важные новинки, которые ждут Вас в JDK 5.0. На взгляд автора их достаточно много

Все замечания и пожелания автор принимает с удовольствием.