Bu, üç farklı faktörün bir karışımıdır:
- Jvm'nin belirli tip sistemi
- Türleri tanımlarken farklı kullanım durumları için biraz farklı anlambilim ihtiyacı
- Dil geliştikçe bunlardan bazılarının daha önce ve bazılarının daha sonra geliştirildiği gerçeği.
İlk önce bunların ne işe yaradığını düşünelim. deftype ve gen-class , önceden derleme için adlandırılmış bir sınıf tanımlaması açısından benzerdir. Gen sınıfı önce geldi, ardından clojure 1.2'de deftype geldi. Deftype tercih edilir ve daha iyi performans özelliklerine sahiptir, ancak daha kısıtlayıcıdır. Deftype sınıfı bir arabirime uyabilir ancak başka bir sınıftan miras alamaz.
Reify ve proxy , çalışma zamanında anonim bir sınıfın bir örneğini dinamik olarak oluşturmak için kullanılır. Proxy önce geldi, reify deftype ile geldi ve clojure 1.2'de defrecord. Reify, tıpkı deftype gibi, anlambilimin fazla kısıtlayıcı olmadığı durumlarda tercih edilir.
Bu, aynı anda ortaya çıktıkları ve benzer bir role sahip oldukları için neden hem deftype hem de defrecord sorusunu bırakıyor. Çoğu amaç için defrecord kullanmak isteyeceğiz: bildiğimiz ve sevdiğimiz tüm çeşitli clojure iyiliğine, sıralanabilirliğe ve benzerlerine sahip. Deftype, diğer veri yapılarının uygulanması için düşük seviyeli bir yapı taşı olarak kullanılmak üzere tasarlanmıştır. Normal clojure arayüzlerini içermez, ancak değiştirilebilir alanlar seçeneğine sahiptir (ancak bu varsayılan değildir).
Daha fazla okumak için kontrol edin:
Clojure.org veri türleri sayfası
Deftype ve reify'ın tanıtıldığı google grup dizisi