Joe Darcy (лидер проекта Project Coin из Sun) выложил окончательный список нововведений языка Java 7 (оригинал тут). Вот эти нововведения:
String в switch-case выражениях:
Пример:
Автоматическое управление ресурсами
В настоящее время для освобождения ресурсов помимо памяти приходится использовать конструкцию try-finally. Новый подход сделает код более компактным и устойчивым к ошибкам. Например, вместо такого кода:
можно будет написать:
Улучшенный вывод типов (type inference) при создании generic-экземляров
На сегодня в Java часто приходится повторяться при инициализации переменной generic-типом. Java 7 позволит делать то же самое более элегантно. Например, старая конструкция:
может быть переписана так:
Улучшенный вызов методов с переменным числом аргументов (varargs)
Теперь предупреждение будет выдаваться не в точке вызова метода, а в месте его объявления.
Раньше:
Теперь:
Улучшенные литералы
Тут будут два нововведения: бинарные литералы (вида 0b101 или 0B101 ) и поддержка подчёркиваний в числовых литералах для лучшей читаемости (например 9_223_372_036_854_775_807L).
Встроенная в язык поддержка коллекций
Объединяет два нововведения: литералы коллекций и новый вид доступа к Lists и Maps (через []). Литералы коллекций упрощают инициализацию новых Lists, Sets и Maps. Раньше:
Теперь:
При использовании фигурных скобок создаётся Set:
Старый способ инициализации Map:
Новый способ инициализации Map:
Обратите внимание, что созданные таким образом коллекции будут immutable.
Поддержка JSR 292 (динамическая типизация на уровне языка)
Для поддержки динамической типизации вводится новый тип java.dyn.Dynamic. Пример использования:
Этот код всегда будет компилироваться, но выдаcт run-time exception, если указанные методы будут отсутствовать в переменной типа Dynamic.
Отвергнутые предложения
Некоторые потенциальные нововведения были отменены в самом конце обсуждения. Среди них: улучшенная обработка исключений, Элвис-оператор и другие null-безопасные операторы, а так же большие массивы.
Ну и что вы об этом думаете?
Update: Прошу прощения за косяки в изначальной версии. Предпросмотр почему-то опубликовал топик. Да ещё и Хабр-тэги об generics спотыкались.
Update 2: antalus справедливо заметил, что это далеко не все нововведения в 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, а лишь относящиеся к языку. Полный список тут.