นี่คือการผสมผสานของปัจจัยสามอย่างที่แตกต่างกัน:
- ระบบประเภทเฉพาะของ jvm
- ความต้องการความหมายที่แตกต่างกันเล็กน้อยสำหรับกรณีการใช้งานที่แตกต่างกันเมื่อกำหนดประเภท
- ความจริงที่ว่าบางส่วนได้รับการพัฒนามาก่อนหน้านี้และบางส่วนในภายหลังเนื่องจากภาษาได้พัฒนาไป
ก่อนอื่นเรามาพิจารณาว่าสิ่งเหล่านี้ทำอะไร deftypeและgen-classมีความคล้ายคลึงกันตรงที่ทั้งคู่กำหนดคลาสที่มีชื่อสำหรับการคอมไพล์ล่วงหน้า Gen-class มาก่อนตามด้วย deftype ใน clojure 1.2 Deftype เป็นที่ต้องการและมีลักษณะการทำงานที่ดีกว่า แต่มีข้อ จำกัด มากกว่า คลาส deftype สามารถสอดคล้องกับอินเทอร์เฟซ แต่ไม่สามารถสืบทอดจากคลาสอื่นได้
Reifyและproxyถูกใช้เพื่อสร้างอินสแตนซ์ของคลาสที่ไม่ระบุชื่อแบบไดนามิกที่รันไทม์ Proxy มาก่อน reify มาพร้อมกับ deftype และ defrecord ใน clojure 1.2 Reify เป็นที่ต้องการเช่นเดียวกับ deftype โดยที่ความหมายไม่ จำกัด เกินไป
นั่นทำให้เกิดคำถามว่าทำไมทั้ง Deftype และ Defrecord เนื่องจากพวกเขาปรากฏตัวในเวลาเดียวกันและมีบทบาทคล้ายกัน สำหรับจุดประสงค์ส่วนใหญ่เราต้องการใช้ defrecord: มันมีความดีงามต่างๆของ clojure ที่เรารู้จักและชื่นชอบความสามารถในการต่อเนื่องและอื่น ๆ Deftype มีไว้สำหรับใช้เป็น Building Block ระดับต่ำสำหรับการใช้งานโครงสร้างข้อมูลอื่น ๆ ไม่รวมอินเทอร์เฟซ clojure ปกติ แต่มีตัวเลือกของฟิลด์ที่เปลี่ยนแปลงได้ (แม้ว่าจะไม่ใช่ค่าเริ่มต้น)
สำหรับการอ่านเพิ่มเติมโปรดดู:
หน้าประเภทข้อมูล clojure.org
เธรดกลุ่ม Google ที่มีการแนะนำ deftype และ reify