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

топ 100 блогов ru_java20.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, и теперь используется очень много где.

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

Архив записей в блогах:
Момодзи в переводе с японского означает «красные листья», а наиболее яркие оттенки в осеннюю палитру вносят именно листья клена каэдэ, поэтому в обиходе японцы часто называют сам клен момидзи. На территории страны существует огромное количество мест, известных красивым цветением ...
Клювастый рыжий великан Вращает оком. Не богом создан был тукан - Безумием Ван-Гога. (В. Колесников) Вот вы думаете, тукан – важная такая из себя птица, вон нос у него какой… видный, и оперение шикарное. Просто царь среди… попугаев. Мол! А тукан и не попугай вовсе, он из ...
Мы все такие умные, шокапец. Особенно когда раздаем советы в интернете и диагнозы по юпику. Ну, а коли так, то давайте делиться взаимной мудростью. ( Read more ... ...
Увидела в ЖЖ и в ФБ обсуждения кормления грудью в общественных местах. Удивилась двум вещам: тому, что ничего не меняется, и себе – не пошла и ничего не написала, хотя мне есть что сказать. И у себя я про другое напишу. Мы в четверг ходили на концерт Юрского. Про Юрского что писать? Любые ...
Как-тол совершенно внезапно стал еще на год старше. Что за это время не поменялось, так состояние некоторой задолбанности. Ибо работа - она такая :) Мог ли я подумать в прошлом году, что внезапно стану начальником отдела? Вот уж вряд ли. Хотя работа в команде у меня уже давно происходит, ...