ほとんどの OO プログラムのクラスは、実装/プログラミングドメインの成果物であるクラス(例:String やコレクションクラス、または Clojure の参照型)と、アプリケーションドメイン情報を表すクラス(例:Employee、PurchaseOrder など)の 2 つの明確なカテゴリに分類されます。アプリケーションドメイン情報にクラスを使用することの不幸な特徴は、情報がクラス固有のマイクロ言語の背後に隠されることです。たとえば、一見無害な employee.getName() でさえ、データへのカスタムインターフェースです。このようなクラスに情報を入れることは、すべての本が異なる言語で書かれているようなものです。もはや情報処理に対する一般的なアプローチを取ることはできません。これは、不必要な具体性の爆発と、再利用の不足につながります。
これが、Clojure が常にそのような情報をマップに入れることを推奨してきた理由であり、そのアドバイスはデータ型でも変わりません。defrecord を使用すると、汎用的に操作可能な情報に加えて、型駆動のポリモーフィズムとフィールドの構造的効率という追加のメリットが得られます。OTOH、ベクターのようなコレクションを定義するデータ型がマップのデフォルト実装を持つことは意味がないため、deftype はこのようなプログラミング構成を定義するのに適しています。
全体として、レコードはすべての情報伝達目的において structmap よりも優れており、そのような structmap を defrecord に移動する必要があります。structmap をプログラミング構成に使用しようとしているコードは多くはないと思われますが、もしそうであれば、deftype がはるかに適していることがわかるでしょう。
AOT コンパイルされた deftype/defrecord は、制限が禁止されていない場合、gen-class のユースケースの一部に適している場合があります。そのような場合、gen-class よりもパフォーマンスが向上します。