Алгебраические типы данных в Java.

топ 100 блогов ru_java — 20.01.2010

Алгебраические типы данных (algebraic data types, ADT) — это такая штука, без которых не обходится ни один программист на функциональных языках (тех их них, в которых есть типы), но они могут пригодиться и в объектно-ориентированных. В ООП алгебраические типы данных занимают (могут занимать) промежуточное положение между enumerations и полноценной иерархией классов. В хорошем, годном языке Scala ADT есть (там они называются case classes), но в нашей нищебродской джаве их нет, как нет и многих других вкусностей. А хочется. Давайте попробуем разобраться, как бы их можно заполучить.

Возьмём типичный пример применения ADT: множество способов проведения платежа (точнее, биллинговой информации) в интернет-магазине. Допустим, у нас есть следующие опции:

  • оплата наличными при доставке курьером (cash on delivery);
  • оплата кредитной карточкой;
  • выставление счёта.

В таком языке как Haskell это можно описать прямо дословно (пример невозбранно стырен из книги Real World Haskell):

Практически дословно эту конструкцию можно перевести в Scala:

В Java, конечно, мы лишены такого счастья. Но кое-что всё-таки можно сделать.

Обычно начинают с того, что делают всю иерархию классов. Потом вспоминают, что создавать новый инстанс класса CashOnDelivery каждый раз — не очень умно, и делают его синглтоном. Потом понимают, что совершенно разный синтаксис обращения к подтипам — не очень кошерно, и делают либо кэш в виде HashMap, либо просто поля в каком-то надклассе. В конечном счёте можно прийти вот к такой конструкции:

Всё это, конечно, страшно нарушает священный талмуд сановских Code Conventions for Java, но зато делает возможным почти настоящий синтаксис работы с ADT:

Матчинг, правда, приходится делать через instanceof:

Но это выглядит достаточно прилично, чтобы можно было пользоваться.

Таким образом, алгебраические типы данных в Java всё же существуют. Но как они это делают!.. (с) Соответственно, любой разумный человек должен переключаться на Scala сразу же, как это станет возможным. Да, это была провокация. Но помечтать-то можно?

Данная идея принадлежит перу Алгебраические типы данных в Java. [info]akuklev, и теперь используется очень много где.

Оставить комментарий

Архив записей в блогах:
Надеюсь беременные женщины, шоферы за рулем, лица, работающие со сложными механизмами, а также люди, не достигшие возраста 18 лет уже легли спать...Хейди Монтаг (Heidi Montag) - 24-летняя американская певица и телезвезда. Стала известна благодаря участию в ...
Почему я разместил цитату доброго русского человека про "сталинских морячков"? В чём там смысл? ...
Приемный сын Сергея Зверева. Фото: На самом деле/ RuTube Приёмный сын Сергея Зверева, российского стилиста, шоумена и ведущего, тоже Сергей намерен отсудить у отца 25 млн рублей за ...
Что изменится для России и Европы после перехода на расчеты за газ в рублях. Зачем Россия требует проводить расчеты за газ в рублях. Почему перевод Европы на расчеты в рублях ведет к укреплению курса рубля.    Почему Европа будет вынуждена покупать рубли для оплаты ими ...
Лес является местом, где можно найти самые разные вещи. Это любимое место тех, кто копает, как официально, так "по-черному", поскольку в лесу много чего можно спрятать. Причем не обязательно, что изначально тут был лес. Местность нередко может меняться до неузнаваемости. Там где сейчас ...