- PVSM.RU - https://www.pvsm.ru -

Этот пост — вольно-краткий перевод документа State of the Values [1], предложения по введению типов-значений в JVM и сам язык Java, который написали Джон Роуз, Брайан Гоетц и Гай Стил, разбавленный моими мыслями. Опущены детали предложения по реализации типов-значений на уровне байт-кода, что не очень интересно для большинства Java-программистов.
Предполагаемые варианты использования типов-значений:
Optional<T>, Choice<T,U>, перечисленияЦелевые фичи:
equals(), toString(). Вызов метода не (обязательно) приводит к приведению к обычному объекту. Инкапсуляция полей возможна.equals(), hashCode(), toString(), compareTo() по полям, если не переопределены в коде.Comparable не обязательно приводит к оборачиванию значения в объект.volatile.Ограничения (должно быть запрещено или вызывать оборачивание в объект-двойник):
java.lang.Number.)wait(), notify(), clone() или finalize() на значении.System.identityHashCode() к значению.null.Object или любому супертипу.Объявление типа-значения максимально приближено к обычным классам:
final __ByValue class Point {
public final int x;
public final int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public boolean equals(Point that) {
return this.x == that.x && this.y == that.y;
}
}
Уродливое __ByValue специально для того, чтобы никто не воспринимал это как окончательный синтаксис. Может, будет аннотация типа @ValueType. Объявление полей финальными — либо обязательно, либо неявное, как сейчас методы в интерфейсах можно объявить без public, но они все равно будут публичными. То же касается и модификатора класса.
Создание значения:
Point p = __MakeValue(x, y);
Тут вместо __MakeValue будет либо название типа без new, либо ничего, т. е. создание значения — просто скобочки с аргументами.
Поддержки специальных литералов (типа 0 + 1i для комплексных чисел или 1u для беззнаковых), а также перегрузки операторов (что было бы полезно тоже в первую очередь для числовых типов), скорее всего, не будет.
Надо понимать, что массивы, java.lang.String, java.lang.Integer и т. д. для бинарной совместимости в типы-значения преобразованы не будут. Так что существующий код магически не ускорится. По крайней мере, не в разы. Внутренний тип java.util.HashMap.Entry, например, поменять вполне могут.
Возможно, сделают отдельную сущность для массивов-значений, которые могут заменить varargs на уровне языка.
| Объект | Значение | |
| Содержит что-то разное | Объект | Типы-значения |
| Одинаковое | Массивы | Массивы-значения? |
Самый важный вопрос. В текущем виде дженерики — фича времени компиляции, и никаких типов-значений они поддерживать не будут. Но раз уж сказал «А» (типы-значения), то говори и «Б», поэтому рано или поздно дженерики переделают.
Мой прогноз:
Я знаю, этот блог читает много сотрудников Oracle, которые куда внимательнее следят за списками рассылки и вообще ближе к теме, буду рад если они внесут важные уточнения.
Автор: leventov
Источник [2]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/java/59644
Ссылки в тексте:
[1] State of the Values: http://cr.openjdk.java.net/~jrose/values/values-0.html
[2] Источник: http://habrahabr.ru/post/222113/
Нажмите здесь для печати.