Це поєднання трьох різних факторів:
- Конкретна система типів jvm
- Необхідність дещо іншої семантики для різних випадків використання при визначенні типів
- Справа в тому, що деякі з них були розроблені раніше, а деякі пізніше, коли мова розвивалася.
Тож спочатку давайте розглянемо, що вони роблять. deftype та gen-class подібні тим, що обидва вони визначають іменований клас для попередньої компіляції. Gen-клас був на першому місці, а потім дефтайп в clojure 1.2. Дефтайп є кращим і має кращі експлуатаційні характеристики, але є більш обмежувальним. Клас deftype може відповідати інтерфейсу, але не може успадковувати від іншого класу.
Reify і proxy використовуються для динамічного створення екземпляра анонімного класу під час виконання. Першим став проксі, reify - разом із дефтайпом та дефкордом у clojure 1.2. Переважним є Reify, як і deftype, де семантика не надто обмежує.
Це залишає питання про те, чому і дефтайп, і дефкординг, оскільки вони з'явилися одночасно, і виконують подібну роль. Для більшості цілей ми хочемо скористатися дефкордом: у ньому є всі різноманітні добрі клоджюри, які ми знаємо, і які ми любимо, відокремленість тощо. Deftype призначений для використання в якості будівельного блоку низького рівня для реалізації інших структур даних. Він не включає звичайні інтерфейси clojure, але у нього є опція змінних полів (хоча це не за замовчуванням).
Для подальшого читання перегляньте:
Сторінка типів даних clojure.org
Потік групи Google, де було введено deftype та reify