Вчера 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-классы и внедрить их в язык. Вот некоторые из них:
- Должен ли data-класс быть неизменяемым? Если нет, то какой будет синтаксис для изменяемых переменных? На текущий момент ответа нет.
- Могут ли data-классы участвовать в наследовании? Вероятно, будет разрешено только наследование от интерфейсов и от абстрактных data-классов.
- Должна ли быть возможность объявлять дополнительные поля в data-классе? Плохая идея, так что, скорее всего, нет.
- Можно ли сделать собственную реализацию конструкторов? Предварительно да, в конце тела конструктора должен быть вызов основного конструктора.
- Как data-классы будут сочетаться с value-типами из проекта Valhalla?
Над всеми этими непростыми вопросами архитекторам языка предстоит хорошо поработать и, в конце концов, дать на них точный ответ, однако уже скоро Brian Goetz обещает выложить рабочий прототип.