It життя що нового в jdk 7 - частина перша
Днями завершилася конференція Devoxx.com. де Mark Reinhold офіційно оголосив - замикання (closures) будуть в JDK 7. Для багатьох замикання були дуже важливим нововведенням - з одного боку вони повинні значно розширити виразність мови і привнести деяку частку функціонального програмування в Java. В ось з іншого боку це ускладнить мову - і не всі розробники зможуть в повній мірі використовувати ці можливості.
Але замикання це окрема тема для окремої статті, зараз можу запропонувати тільки оригінальну статтю Closures in JDK 7. Я постараюся написати про це пізніше.
Набагато з 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];
При цьому дані колекції будуть незмінні (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
При цьому в більшості випадків доводиться дублювати типу значень колекції. Ця проблема була вирішена в бібліотеки google-collections. а тепер це включать і в саму мову.
Тепер можна буде писати:
Map
При цьому вводиться оператор <> - 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
Детально про це нововведення можна прочитати в PROPOSAL: Simplified Varargs Method Invocation я приведу лише приклад.
Зараз ми маємо:
static
static List
.
* // Warning: ** "uses unchecked or unsafe operations" *
return asList (a, b, c);
>
А буде:
* // Warning: ** "enables unsafe generic array creation" *
static
static List
.
return asList (a, b, c);
>
Разом: Я описав тільки невелику частину новинок, які нас чекають в JDK 7. Звичайно найголовнішою Новіков будуть замикання, але про них в наступний раз. А зараз я можу сказати що швидше за все будуть використовувати diamond оператор і швидше за все автоматичне керування ресурсів. А ось рядки в switch мені здаються злом, тому що поощеряют використання строкових констант замість enum.
Також хочу зазначити, що це тільки перший пост в цій серії - продовження обов'язково буде.