Đây là sự kết hợp của ba yếu tố khác nhau:
- Hệ thống loại cụ thể của jvm
- Nhu cầu về ngữ nghĩa hơi khác nhau cho các trường hợp sử dụng khác nhau khi xác định các loại
- Thực tế là một số trong số này đã được phát triển trước đó, và một số muộn hơn, khi ngôn ngữ đã phát triển.
Vì vậy, trước tiên, chúng ta hãy xem xét những gì làm. deftype và gen-class giống nhau ở chỗ cả hai đều định nghĩa một lớp được đặt tên để biên dịch trước thời hạn. Gen-class đứng đầu, tiếp theo là deftype in clojure 1.2. Deftype được ưa thích hơn và có các đặc điểm hiệu suất tốt hơn, nhưng hạn chế hơn. Một lớp định dạng có thể tuân theo một giao diện, nhưng không thể kế thừa từ một lớp khác.
Reify và proxy đều được sử dụng để tạo động một phiên bản của lớp ẩn danh trong thời gian chạy. Proxy xuất hiện đầu tiên, sửa đổi đi kèm với định dạng và xóa ghi âm trong clojure 1.2. Reify được ưu tiên hơn, cũng giống như deftype, nơi ngữ nghĩa không quá hạn chế.
Điều đó đặt ra câu hỏi tại sao cả hai định dạng và xóa ghi âm, vì chúng xuất hiện cùng một lúc và có vai trò giống nhau. Đối với hầu hết các mục đích, chúng tôi sẽ muốn sử dụng defrecord: nó có tất cả các tính năng tốt của áo choàng khác nhau mà chúng tôi biết và yêu thích, khả năng tuần tự, v.v. Deftype được thiết kế để sử dụng như một khối xây dựng cấp thấp để triển khai các cấu trúc dữ liệu khác. Nó không bao gồm các giao diện clojure thông thường, nhưng nó có tùy chọn các trường có thể thay đổi (mặc dù đây không phải là mặc định).
Để đọc thêm, hãy xem:
Trang dữ liệu clojure.org
Chuỗi nhóm google nơi giới thiệu định dạng và sửa đổi