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> Anagrams = new HashMap> ();

При цьому в більшості випадків доводиться дублювати типу значень колекції. Ця проблема була вирішена в бібліотеки google-collections. а тепер це включать і в саму мову.

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

Map> 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

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

Зараз ми маємо:


static List asList (T. elements)

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

А буде:

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

static List> StringFactories () Callable a, b, c;
.
return asList (a, b, c);
>

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

Також хочу зазначити, що це тільки перший пост в цій серії - продовження обов'язково буде.