На днях завершилась конференция 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). Теперь вместо:
можно будет писать
При этом данные коллекции будут неизменяемы (immutable).
Автоматическое управление ресурсами
Некоторые ресурсы, создаваемые в процессе работы приложения, должны быть закрыты явно - обычно с помощью метода close(). В Java 7 будет расширен функционал try блока, позволяя прямо в try блоке декларировать необходимые ресурсы, которые по завершению блока будут коректно закрыты (с помощью вызова close()).
Резонным вопросом будет - а как среда выполнения будет определять ресурсы, требующие и поддерживающие явное закрытие? Ответ прост - будет создан новый интерфейс Closable и соответсвующие классы ресурсов (InputStream, Writers, Sockets, Sql клссы) будут расширены для реализации этого интерфейса. Такая реализация будет обратно совместима со старыми версиями Java.
А теперь пример. Сейчас чтение из файла выглядит следующим образом:
В Java 7 этот код может быть переписан как:
Улучшенное вычисление типов при создании коллекций
Я думаю что почти все программисты сталкивались с необходимостью писать:
При этом в большинстве случаев приходится дублировать типу значений коллекции. Эта проблема была решена в библиотеки google-collections, а теперь это включат и в сам язык.
Теперь можно будет писать:
При этом вводится оператор <> - diamond (брилиант), который получает тип от описания ссылки.
Подчеркивания в числах
Одно из самых бесполезных для меня нововведений в этой статье:
Официальная причина - повышение читабельности большие int и long.
Использование строк в операторе switch
До данного момента в операторе switch можно было использовать только числа (Number) и перечисления (enum). В Java 7 возможно будет добавлена поддержка строк:
Упрощенный вызов метода с переменным числом аргументов
Если сейчас вы попытаетесь вызвать метод с переменным количеством параметров, тип которых явно неопределен (используются Generic), то вызов метода будет отмечен предупреждением от компилятора. В Java 7 этот warning будет относиться к объявлению метода, а не его вызову.
Подробно о этом нововведении можно прочитать в PROPOSAL: Simplified Varargs Method Invocation я приведу лишь пример.
Сейчас мы имеем:
А будет:
Итого: Я описал только небольшую часть новинок, которые нас ждут в JDK 7. Конечно самой главной новикой будут замыкания, но о них в следующий раз. А сейчас я могу сказать что скорее всего будут использовать diamond оператор и скорее всего автоматическое управление ресурсов. А вот строки в switch мне кажутся злом, т.к. поощеряют использование строковых констант вместо enum.
Также хочу отметить что это только первый пост в этой серии - продолжение обязательно будет.
Но замыкания это отдельная тема для отдельной статьи, сейчас могу предложить только оригинальную статью 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.
Также хочу отметить что это только первый пост в этой серии - продолжение обязательно будет.
Так вышло, что я только сейчас увидел эту статью)
ОтветитьУдалитьНеплохое описание..хотя инфа конечно же устарела уже. Keep posting!
- Михаил
"В Java 7 этот код может быть переписан как:
ОтветитьУдалитьtry (BufferedReader br = new BufferedReader(new FileReader(path)) {
return br.readLine();
}"
Не хватает одной закрывающей скобки, или я чего-то не понимаю?
Да, конечно не хватает. Исправил.
Удалить