Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Типы-значения в Java

Anna | 1.06.2014 | нет комментариев

Данный пост — свободно-короткий перевод документа State of the Values, предложения по вступлению типов-значений в JVM и сам язык Java, тот, что написали Джон Роуз, Брайан Гоетц и Гай Стил, разбавленный моими мыслями. Опущены детали предложения по реализации типов-значений на ярусе байт-кода, что не дюже увлекательно для большинства Java-программистов.


Значимая мысль: объектная (ссылочная) идентичность необходима только для поддержки изменяемости объектов. Объект может изменить состояние, но по ссылке мы неизменно можем проверить, что это «тот же» объект. Следственно типы-значения будут сурово неизменяемые.

Полагаемые варианты применения типов-значений:

  • Числа: комплексные, беззнаковые, 128-битные, с фиксированной запятой и т. д. Все, что не описывается имеющимися примитивами.
  • Алгебраические типы: Optional<T>Choice<T,U>, перечисления
  • Кортежи: пары, тройки, …
  • Итераторы, курсоры
  • «Уплощение» трудных конструкций

Целевые фичи:

  • Дозволено применять типы-значения всюду, где теперь дозволено объекты и примитивы: локальные переменные, поля, элементы массива, доводы способов, возвращаемый тип способов.
  • В обыкновенной обстановки аллокация в регистрах, на стеке, поле-значение это не ссылка, а прямо байты полей в родительском объекте. Правда у ВМ есть право таки сделать значение в куче, напр. если она считает, что так будет отличнее, не может напротив обеспечить атомарность, не хватает стека, и т. д. Массивы с элементами типа-значения обязаны быть «плоскими».
  • При необходимости (напр. при передаче в способ, тот, что хочет Object) неявные приведение (boxing) к обыкновенному объекту-двойнику (как теперь с примитивами).
  • Не легко структурки с полями: дозволено объявлять способы как в обыкновенном объекте, переопределять 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.Stringjava.lang.Integer и т. д. для бинарной совместимости в типы-значения преобразованы не будут. Так что присутствующий код магически не ускорится. По крайней мере, не в разы. Внутренний тип java.util.HashMap.Entry, скажем, поменять абсолютно могут.

Допустимо, сделают отдельную сущность для массивов-значений, которые могут заменить varargs на ярусе языка.

Объект Значение
Содержит что-то различное Объект Типы-значения
Идентичное Массивы Массивы-значения?
Generics

Самый значимый вопрос. В нынешнем виде дженерики — фича времени компиляции, и никаких типов-значений они поддерживать не будут. Но раз уж сказал «А» (типы-значения), то говори и «Б», следственно рано либо поздно дженерики переделают.

Мой прогноз:

  • Для Java 9 теснее есть одна «основная» фича — модуляризация, Oracle очевидно делает на нее ставку, вероятность увидеть ее в Java 9 близка к 100%.
  • Если в Java 9 дженерики оставят «как есть», шанс увидеть типы-значения в этой версии 30%.
  • Если решат выкатить типы-значения и обновленные дженерики единовременно, в лучшем случае это случится в Java 10.

Я знаю, данный блог читает много работников Oracle, которые куда внимательнее следят за списками рассылки и вообще ближе к теме, буду рад если они внесут значимые уточнения.

Необходимы ли в Java типы-значения?

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Проголосовало 117 человек. Воздержалось 42 человека.

Когда в Java добавят типы-значения (ваш прогноз)?

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Проголосовало 113 человек. Воздержалось 44 человека.

Как вам предложение в нынешнем виде?

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Источник: programmingmaster.ru

 

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB