Статьи

Проект «Янтарь: будущее Java»

Если все идет по плану (Project Jigsaw мы на вас смотрим), Java 9 будет запущен менее чем за 100 дней. Вы можете присоединиться к отсчету времени до его выпуска прямо здесь . Он будет снабжен длинным списком новых и обновленных функций, некоторые из которых мы не можем дождаться, чтобы увидеть в действии.

Однако есть несколько функций, которые не были готовы для Java 9, и именно здесь появляется Project Amber, поэтому эти функции могут стать реальностью. Что это означает? Давай выясним.

Сосредоточение внимания на Var / Val, Enums и Lambda

Проект Amber был впервые представлен в январе прошлого года, когда Брайан Гетц , архитектор языка Java, предложил создать проект для изучения и инкубации небольших, ориентированных на производительность функций языка Java.

Основная предпосылка для функций, которые станут частью этого проекта: они были приняты в качестве кандидатов в JEP, также известные как JDK Enhancement Proposal. Это процесс, в котором Oracle собирает предложения по улучшению Java Development Kit и OpenJDK. Утвержденные предложения продолжают развиваться и становятся актуальными функциями Java.

Гетц отмечает, что этот проект — не то место, где можно придумывать или обсуждать новые и случайные идеи по улучшению Java, и что «весь остальной интернет все еще доступен для этого».

16 марта Гетц приветствовал проект Amber в сообществе Java вместе с первыми тремя принятыми им предложениями по улучшению Java:

Вывод типа локальной переменной (JEP 286) — Расширение вывода типа для объявлений локальных переменных с помощью инициализаторов
Enhanced Enums (JEP 301) — Особенности и способности, которые сделают перечисления лучше
Остатки лямбды (JEP 302) — Улучшение удобства использования лямбды

Почему эти три проекта получили такое особое внимание? Давай выясним.

Познакомьтесь с новыми возможностями проекта Янтарь

Вывод типа локальной переменной

Одна из основных проблем, с которыми большинство разработчиков сталкиваются с Java, заключается в том, что она слишком многословна. Хотя это может быть полезно при чтении и попытке понять, что имели в виду другие разработчики при написании функции, это может быть утомительно при написании этих функций.

Эта функция предлагает добавить немного синтаксического сахара в Java, чтобы упростить его. Это позволило бы объявлять переменные без указания связанного типа. Например, это:

1
2
List<String> list = new ArrayList<String>();
final Stream<String> stream = getStream();

Будет заменено на это:

1
2
var list = new ArrayList<String>();
val stream = getStream();

Если вы хотите узнать больше об этой функции и о том, как сообщество к ней относится, ознакомьтесь с нашим практическим обзором новой функции языка вывода локальных переменных Java .

Расширенные Enums

Цель этой функции — повысить выразительность конструкции enum в языке Java. Как указано в предложении , перечисления Java — это мощная и часто используемая конструкция. Они позволяют группировать константы, где каждая является одноэлементным объектом. Это позволяет переменной быть набором предопределенных констант, когда переменная должна быть равна одному из значений, которые были предопределены для нее. Дни недели, например.

Усовершенствование позволит использовать переменные типа в перечислениях (поддержка обобщений), которые могут расширять перечисление. Также будет предложено выполнить более точную проверку типов для констант перечисления, чтобы проверить и применить ограничения перечисления.

Перечисление с поддержкой обобщений позволит нам указывать наборы ключей с их связанным типом, и у нас будет возможность добавлять методы к отдельным элементам. Эти две функции будут работать вместе, чтобы константы перечисления могли переносить информацию о типе константы, а также о состоянии и поведении константы. Расширенные перечисления позволят нам определять перечисления с универсальными типами. Примером, который может показать некоторое значение для этой функции, является представление математических констант:

01
02
03
04
05
06
07
08
09
10
public enum MathematicalConstants < T > {
    E < Double > (Math.PI),
    PI < Double > (Math.E),
    ZERO < Integer > (0),
    ONE < Integer > (1),
    i < Complex > (new Complex(0, 1))
    private MathematicalConstants(T underlyingObject) {
        this.underlyingObject = underlyingObject;
    }
}

В этом примере мы можем добавить поддержку дополнительных методов, сохраняя при этом безопасность типов для каждого метода. Возможность передавать различные типы в конструктор перечисления, когда нижележащий объект не обязательно должен иметь тип Object, демонстрирует элегантность, которую эта функция может привнести в таблицу.

Другое полезное применение расширенных перечислений — сокращение стандартного кода, который преобразуется между различными типами данных. Например, типы JDBC для типов Java. Это может помочь расширить возможности нашего кода для самостоятельного документирования и избежать появления запахов кода, таких как проверки «instanceOf».

Лямбда остатки

Project Lambda был выпущен с Java 8 в 2014 году, но всегда есть возможности для улучшений. Идея здесь состоит в том, чтобы улучшить удобство использования лямбда-выражений и ссылок на методы, улучшая устранение неоднозначности функциональных выражений в контекстах методов.

Эта функция также направлена ​​на завершение восстановления символа подчеркивания, чтобы указать неиспользуемые параметры лямбда, и позволяет параметрам лямбда скрывать переменные во вложенных областях.

Концепция использования подчеркивания в качестве символа безымянного лямбда-параметра уже существует в других языках, и цель также состоит в том, чтобы сделать его частью Java. Использование довольно простое, и будет выглядеть так:

1
BiFunction<Integer, String, String> biss = (i, _) -> String.valueOf(i);

Почему это важно? Так как это позволит более сильную статическую проверку неиспользуемых аргументов, а также позволяет помечать несколько неиспользуемых аргументов. Однако может быть сложно выполнить эту опцию, поскольку подчеркивание уже является допустимым идентификатором, и для его работы потребуется некоторая настройка и совместимость.

Побочные проекты Java

Project Amber объединяет длинную группу «сторонних проектов» Java, таких как Valhalla , для работы с неизменяемыми и не имеющими ссылок объектами, Shenandoah , целью которой является сокращение времени приостановки GC, и XRender Graphics Pipeline с целью создания нового графического конвейера Java2D ,

Два из наиболее популярных проектов — Lambda и Jigsaw. Проект Lambda был представлен в марте 2014 года как часть Java 8 и принес лямбда-выражения и потоки в Java. Проект Jigsaw собирается стать частью Java 9 с целью сделать Java модульным и разбить JRE на совместимые компоненты.

Оба проекта заняли много времени — Lambda была впервые представлена ​​в декабре 2009 года, и потребовалось чуть более 5 лет, чтобы стать частью Java. Jigsaw был представлен в декабре 2008 года, после чего последовало почти 9 с половиной лет работы.

Это не обязательно означает, что проект Amber будет иметь ту же временную шкалу, но это хороший показатель того, сколько времени потребуется для включения основных функций в Java. Тем не менее, есть немного надежды в объявлении этого проекта.

Наряду со списками рассылки, которые обычно получают проекты, Гетц опубликовал официальное репо. В отличие от аналогичных проектов, так как группа будет работать над несколькими JEP, работа будет выполняться в филиалах, когда по умолчанию будет синхронизирован jdk10. Означает ли это, что Амбер может быть частью следующей версии Java? Придется подождать и посмотреть.

Почему янтарь?

Если вас интересует название и то, как оно было выбрано, Николай Парлог , Java-разработчик и редактор раздела Java в SitePoint, написал этот вопрос самому Брайану Гетцу. Он получил простой ответ «почему нет?».

Однако Гетц предложил провести конкурс, чтобы придумать кандидатов. Он выбрал победителя, который предложил следующее объяснение: «

И ты должен признать, что это звучит круто.

Последние мысли

Java — это массивный язык с множеством функций, возможностей и программистов. Project Amber присоединяется к списку функций, которые уже находятся в разработке и имеют единую цель — помочь фазе разработки быстрее двигаться и отвечать потребностям и желаниям инженеров и разработчиков Java.

Теперь есть два основных вопроса — какие другие предложения примет Project Amber, и сколько времени потребуется, чтобы они стали реальностью Java.