В Java появятся data-классы

Вчера Brian Goetz из Oracle написал письмо со ссылкой на документ, в котором описывается идея введения в Java классов-данных (data-классов). Data-класс – это класс, единственной целью которого является держание некоторого набора данных.

Канонический пример такого прозрачного носителя данных – это класс Point, содержащего в себе два поля int x и int y. Сейчас корректная реализация Point занимает несколько десятков строк кода. Она включает в себя объявление полей, конструктора, методов hashCode(), equals(), toString() и методов доступа к полям. В типичном приложении таких классов может быть большое количество, а значит, программистам приходится вновь и вновь писать однотипные фрагменты кода, что отнимает время, порождает ошибки, ну и просто захламляет проект конструкциями, не имеющими большой смысловой нагрузки. В предложенном в документе варианте такой класс пишется в одну строчку:

__data class Point(int x, int y) { }

Для такого класса компилятор автоматически реализует конструктор, методы hashCode(), equals(), toString(), экстракторы для паттерн-матчинга, а также геттеры x() и y().

Однако, как говорится, дьявол в мелочах, и на самом деле всплывает множество вопросов по поводу того, как правильно спроектировать data-классы и внедрить их в язык. Вот некоторые из них:

  1. Должен ли data-класс быть неизменяемым? Если нет, то какой будет синтаксис для изменяемых переменных? На текущий момент ответа нет.
  2. Могут ли data-классы участвовать в наследовании? Вероятно, будет разрешено только наследование от интерфейсов и от абстрактных data-классов.
  3. Должна ли быть возможность объявлять дополнительные поля в data-классе? Плохая идея, так что, скорее всего, нет.
  4. Можно ли сделать собственную реализацию конструкторов? Предварительно да, в конце тела конструктора должен быть вызов основного конструктора.
  5. Как data-классы будут сочетаться с value-типами из проекта Valhalla?

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

Подписывайтесь на канал в Telegram, чтобы не пропускать новости.

Все материалы на этом сайте выложены под лицензией CC BY-SA 4.0
© Евгений Козлов, 2017-2020