Joe Darcy (лидер проекта Project Coin из Sun) выложил окончательный список нововведений языка Java 7 (оригинал
тут). Вот эти нововведения:
String в switch-case выражениях:
Пример:
String s = ...
switch(s) {
case "foo": processFoo(s);
break;
}
Автоматическое управление ресурсами
В настоящее время для освобождения ресурсов помимо памяти приходится использовать конструкцию try-finally. Новый подход сделает код более компактным и устойчивым к ошибкам. Например, вместо такого кода:
BufferedReader br = new BufferedReader(new FileReader(path));
try {
return br.readLine();
}
finally {
br.close();
}
можно будет написать:
try (BufferedReader br = new BufferedReader(new FileReader(path)) {
return br.readLine();
}
Улучшенный вывод типов (type inference) при создании generic-экземляров
На сегодня в Java часто приходится повторяться при инициализации переменной generic-типом. Java 7 позволит делать то же самое более элегантно. Например, старая конструкция:
Map<String, List<String>> anagrams = new HashMap<String, List<String>>();
может быть переписана так:
Map<String, List<String>> anagrams = new HashMap<>();
Улучшенный вызов методов с переменным числом аргументов (varargs)
Теперь предупреждение будет выдаваться не в точке вызова метода, а в месте его объявления.
Раньше:
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);
}
Улучшенные литералы
Тут будут два нововведения: бинарные литералы (вида 0b101 или 0B101 ) и поддержка подчёркиваний в числовых литералах для лучшей читаемости (например 9_223_372_036_854_775_807L).
Встроенная в язык поддержка коллекций
Объединяет два нововведения: литералы коллекций и новый вид доступа к Lists и Maps (через []). Литералы коллекций упрощают инициализацию новых Lists, Sets и Maps. Раньше:
final List<Integer> piDigits = Collections.unmodifiableList(Arrays.asList(3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 9 ));
Теперь:
final List<Integer> piDigits = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 9];
При использовании фигурных скобок создаётся Set:
final Set<Integer> primes = { 2, 7, 31, 127, 8191, 131071, 524287 };
Старый способ инициализации Map:
final Map<Integer, String> platonicSolids;
static {
solids = new LinkedHashMap;
solids.put(4, "tetrahedron");
solids.put(6, "cube");
solids.put(8, "octahedron");
solids.put(12, "dodecahedron");
solids.put(20, "icosahedron");
platonicSolids = Collections.immutableMap(solids);
}
Новый способ инициализации Map:
final Map<Integer, String> platonicSolids = { 4 : "tetrahedron", 6 : "cube", 8 : "octahedron", 12 : "dodecahedron", 20 : "icosahedron" };
Обратите внимание, что созданные таким образом коллекции будут immutable.
Поддержка JSR 292 (динамическая типизация на уровне языка)
Для поддержки динамической типизации вводится новый тип java.dyn.Dynamic. Пример использования:
Dynamic x = (any type of expression can go here);
Object y = x.foo("ABC").bar(42).baz();
Этот код всегда будет компилироваться, но выдаcт run-time exception, если указанные методы будут отсутствовать в переменной типа Dynamic.
Отвергнутые предложения
Некоторые потенциальные нововведения были отменены в самом конце обсуждения. Среди них: улучшенная обработка исключений, Элвис-оператор и другие null-безопасные операторы, а так же большие массивы.
Ну и что вы об этом думаете?
Update: Прошу прощения за косяки в изначальной версии. Предпросмотр почему-то опубликовал топик. Да ещё и Хабр-тэги об generics спотыкались.
Update 2: antalus справедливо заметил, что это далеко не все нововведения в Java 7, а лишь относящиеся к языку. Полный список
тут.
комментарии (72)
- то ещё поделие. Уж лучшеК восьмой версии будут extension methods и свой linq с преферансом и блудницами?
Однако:
— для scala нет качественного ide с вышеупомянутыми пасьянсом и проститутками
— у меня есть проект на несколько сотен тыщ мильонов строчек с постоянными конструкциями типа
new IConditionCheck(){ public boolean check(Object o){ return o == objectIAmLookingFor; } }оно, конечно, работает. И даже понятно о чём речь. Но глаз всё же цепляется.
Переписывать все сотнитыщмильонов строк на scala — не хватит ни бюджета ни (surprise!) scala-разработчиков.
— А если бы появились замыкания, как бы вы сконвертировали существующий код? Предвижу ответ — вы бы не стали переписывать существующий код. Так чтобы использовать Scala, тоже не надо переписывать существующий код. Она (scala) нормально взаимодействует с java-программой.
Как-то однажды знаменитый учитель Кх Ан вышел на прогулку со учеником Антоном. Надеясь разговорить учителя, Антон спросил: «Учитель, слыхал я, что объекты — очень хорошая штука — правда ли это?» Кх Ан посмотрел на ученика с жалостью в глазах и ответил: «Глупый ученик! Объекты — всего лишь замыкания для бедных.»
Пристыженный Антон простился с учителем и вернулся в свою комнату, горя желанием как можно скорее изучить замыкания. Он внимательно прочитал все статьи из серии «Lambda: The Ultimate», и родственные им статьи, и написал небольшой интерпретатор Scheme с объектно-ориентированной системой, основанной на замыканиях. Он многому научился, и с нетерпением ждал случая сообщить учителю о своих успехах.
Во время следующей прогулки с Кх Аном, Антон, пытаясь произвести хорошее впечатление, сказал: «Учитель, я прилежно изучил этот вопрос, и понимаю теперь, что объекты — воистину замыкания для бедных.» Кх Ан в ответ ударил Антона палкой и воскликнул: «Когда же ты чему-то научишься? Замыкания — это объекты для бедных!» В эту секунду Антон обрел просветление.
Карл у Клары украл dynamic, а Клара у Карла украла байткод.
"?:", "?.", "?[]"
Примеры:
Неплохая была идея, кстати. Сужу по опыту работы с Groovy.
То же самое и по поводу замыканий — Scala язык функциональный, там они к месту. В Java можно обойтись упрощением синтаксиса для уже существующих анонимных классов — docs.google.com/Doc.aspx?id=k73_1ggr36h
Я рад ништякам — очень консервативно и по делу. Улучшенную обработку исключений и CICE всё же хотелось бы рано или поздно увидеть в языке.
MyClass<OtherClass, AnotherClass> my = new MyClass<OtherClass, AnotherClass>()
читается гораздо хуже чем
var my = new MyClass<OtherClass, AnotherClass>()
Мне кажется, не обязательно читать одно и то же два раза, чтобы понять смысл.
switch (10) { case 0 : assert false ; break case 0..9 : assert false ; break case [8,9,11] : assert false ; break case Float : assert false ; break case {it%3 == 0}: assert false ; break case ~/../ : assert true ; break default : assert false ; break }Последний case — это совпадение с регулярным выражением.
Недавно была добавлена поддержка LINQ, скоро будет релиз версии 1.0 :) У языка есть хороший плагин для поддержки в студии, а так же своя бесплатная IDE на основе visual studio shell. На днях проект стал еще более открытым — репозиторий переехал на google code.
Хотя с другой стороны, создатели языка постарались: у них получился очень сбалансированный и мощный язык, который не утратил актуальности до сих пор. Mainstream языки, какие как Java и C# (в меньшей степени), с каждой новой версией стремятся к возможностям, которые предоставляет Nemerle, но, в отличии от них, он изначально был спроектирован под эти возможности и поэтому выглядит более элегантно.
В JDK7 помимо изменений в lang вносятся также изменения в части vm, core, client, web. Интересующимся читать на английском тут