среда, 25 ноября 2009 г.

Что нового в JDK 7 - Часть первая

На днях завершилась конференция Devoxx.com, где Mark Reinhold официально объявил - замыкания (closures) будут в JDK 7. Для многих замыкания были очень важным нововведением - с одной стороны они должны значительно расширить выразительность языка и привнести некоторую долю функционального программирования в Java. В вот с другой стороны это усложнит язык - и не все разработчики смогут в полной мере использовать эти возможности.

Но замыкания это отдельная тема для отдельной статьи, сейчас могу предложить только оригинальную статью Closures in JDK 7. Я постараюсь написать об этом позже.

А теперь вернемся к теме - А что-же еще нового в JDK 7, которая должна выйти в сентябре 2010 года?

Намнем с 7ми нововедений в языке, которые были реализованы в рамках проекта Coin (это перевод статьи New language features in Java 7):



Расширенная поддержка коллекций в языке:

В Java будет реализован новый синтаксис для создания коллекций (в стиле Ruby). Теперь вместо:


List list = new ArrayList();
list.add("item");
String item = list.get(0);

Set set = new HashSet();
set.add("item");

Map map = new HashMap();
map.put("key", 1);
int value = map.get("key");


можно будет писать


List list = ["item"];
String item = list[0];

Set set = {"item"};

Map map = {"key" : 1};
int value = map["key"];


При этом данные коллекции будут неизменяемы (immutable).

Автоматическое управление ресурсами

Некоторые ресурсы, создаваемые в процессе работы приложения, должны быть закрыты явно - обычно с помощью метода close(). В Java 7 будет расширен функционал try блока, позволяя прямо в try блоке декларировать необходимые ресурсы, которые по завершению блока будут коректно закрыты (с помощью вызова close()).

Резонным вопросом будет - а как среда выполнения будет определять ресурсы, требующие и поддерживающие явное закрытие? Ответ прост - будет создан новый интерфейс Closable и соответсвующие классы ресурсов (InputStream, Writers, Sockets, Sql клссы) будут расширены для реализации этого интерфейса. Такая реализация будет обратно совместима со старыми версиями Java.

А теперь пример. Сейчас чтение из файла выглядит следующим образом:


BufferedReader br = new BufferedReader(new FileReader(path));
try {
return br.readLine();
} finally {
br.close();
}


В Java 7 этот код может быть переписан как:


try (BufferedReader br = new BufferedReader(new FileReader(path))) {
return br.readLine();
}


Улучшенное вычисление типов при создании коллекций

Я думаю что почти все программисты сталкивались с необходимостью писать:

Map<String, List<String>> anagrams = new HashMap<String, List<String>>();


При этом в большинстве случаев приходится дублировать типу значений коллекции. Эта проблема была решена в библиотеки google-collections, а теперь это включат и в сам язык.

Теперь можно будет писать:

Map<String, List<String>> anagrams = new HashMap<>();

При этом вводится оператор <> - diamond (брилиант), который получает тип от описания ссылки.

Подчеркивания в числах

Одно из самых бесполезных для меня нововведений в этой статье:


int one_million = 1_000_000;


Официальная причина - повышение читабельности большие int и long.

Использование строк в операторе switch

До данного момента в операторе switch можно было использовать только числа (Number) и перечисления (enum). В Java 7 возможно будет добавлена поддержка строк:


String s = ...
switch(s) {
case "quux":
processQuux(s);
// fall-through

case "foo":
case "bar":
processFooOrBar(s);
break;

case "baz":
processBaz(s);
// fall-through

default:
processDefault(s);
break;
}


Упрощенный вызов метода с переменным числом аргументов
Если сейчас вы попытаетесь вызвать метод с переменным количеством параметров, тип которых явно неопределен (используются Generic), то вызов метода будет отмечен предупреждением от компилятора. В Java 7 этот warning будет относиться к объявлению метода, а не его вызову.

Подробно о этом нововведении можно прочитать в PROPOSAL: Simplified Varargs Method Invocation я приведу лишь пример.

Сейчас мы имеем:


static <T> List<T> asList(T... elements) { ... }

static List<Callable<String>> stringFactories() {
Callable<String> a, b, c;
...
*// Warning: **"uses unchecked or unsafe operations"*
return asList(a, b, c);
}


А будет:

*// Warning: **"enables unsafe generic array creation"*
static <T> List<T> asList(T... elements) { ... }

static List<Callable<String>> stringFactories() {
Callable<String> a, b, c;
...
return asList(a, b, c);
}


Итого: Я описал только небольшую часть новинок, которые нас ждут в JDK 7. Конечно самой главной новикой будут замыкания, но о них в следующий раз. А сейчас я могу сказать что скорее всего будут использовать diamond оператор и скорее всего автоматическое управление ресурсов. А вот строки в switch мне кажутся злом, т.к. поощеряют использование строковых констант вместо enum.

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

3 комментария:

  1. Так вышло, что я только сейчас увидел эту статью)
    Неплохое описание..хотя инфа конечно же устарела уже. Keep posting!

    - Михаил

    ОтветитьУдалить
  2. "В Java 7 этот код может быть переписан как:
    try (BufferedReader br = new BufferedReader(new FileReader(path)) {
    return br.readLine();
    }"
    Не хватает одной закрывающей скобки, или я чего-то не понимаю?

    ОтветитьУдалить