2011-06-29 40 views
11

Vì mục đích tương hợp với Java, tôi cần một lớp có hàm tạo null để thực hiện khởi tạo. Đối tượng của lớp này cần phải có một cái gì đó giống như các trường java có thể thay đổi (cụ thể là, đối tượng đại diện cho phần phụ của trò chơi và cần giữ trạng thái trò chơi).Thêm hàm tạo vào deftype tạo lớp

deftype hiện mọi thứ Tôi muốn làm ngoại trừ cung cấp hàm tạo null (vì tôi đang tạo lớp với các trường).

Tôi không cần các trường có thể đọc công khai, vì vậy tôi có thể nghĩ đến 4 giải pháp:

Sử dụng cấp độ gen; Tôi không muốn làm điều này nếu tôi có thể tránh nó.
Bằng cách nào đó mã hóa các biến thành viên riêng tư bên ngoài kiến ​​thức về deftype; Tôi đã nói với điều này không thể được thực hiện.
Viết một định dạng sửa đổi cũng tạo ra một hàm tạo null; thẳng thắn tôi không biết clojure đủ tốt cho việc này.
Lấy lớp được tạo bởi deftype và bằng cách nào đó thêm một hàm tạo mới vào nó.

Khi kết thúc điều này, tôi cần phải có một lớp Java, vì tôi sẽ chuyển nó sang mã Java để tạo một đối tượng mới từ lớp.

Có bất kỳ giải pháp nào tôi đã đề xuất (hoặc bất kỳ giải pháp nào mà tôi chưa từng nghĩ đến) ngoài việc sử dụng lớp gen khả thi?

+0

Dường như việc tạo dựng hàm tạo nằm sâu bên trong mã java của clojure. Vì vậy, sửa đổi deftype chính nó âm thanh chút khó khăn và một chút ý tưởng tồi. –

+0

các trường sẽ được truy cập như thế nào và cá thể đã tạo ra yourClass.newInstance() và phản ánh? SO có lẽ biết nhiều hơn về việc sử dụng Java bên cho lớp được tạo ra sẽ giúp đỡ nếu không tôi sợ rằng đó là thời gian cho gen-class: ( –

Trả lời

3

Hoàn toàn không có gì đáng xấu hổ, khi thích hợp, viết một dấu gạch ngang của Java nếu các yêu cầu tương tác Java của bạn đồng thời cụ thể và không thể lay chuyển. Bạn có thể viết một lớp Java với một phương thức duy nhất của nhà máy tĩnh trả về một cá thể của lớp deftype và thực hiện bất kỳ việc khởi tạo/thiết lập nào bạn cần.

Ngoài ra, bạn có thể viết hàm nhà máy rỗng trong Clojure và gọi trực tiếp từ Java cả ngày.

Trong mọi trường hợp, không phải deftype cũng không phải defrecord được dự định là (hoặc sẽ bao giờ là) các thiết bị tương tác đầy đủ tính năng. gen-class chắc chắn đến gần nhất, đó là lý do tại sao nó được khuyến khích.

2

Tôi khuyên bạn chỉ nên viết đối tượng trong Java - đối với các đối tượng giống như Java với các trường có thể thay đổi, nó có thể sẽ thanh lịch, dễ hiểu và thực tế hơn.

Tôi thường có kết quả khá tốt khi trộn mã Java và Clojure trong các dự án. Điều này có vẻ giống như một trong những trường hợp mà điều này có thể thích hợp. Khả năng tương tác tốt đến nỗi bạn hầu như không có thêm bất kỳ sự phức tạp nào.

BTW - Tôi giả định rằng bạn cần một hàm tạo nullary để đáp ứng các yêu cầu của một số thư viện kiên trì hoặc một cái gì đó tương tự? Nó có vẻ như một yêu cầu kỳ quặc khác. Nếu đây là trường hợp sau đó bạn có thể tìm thấy nó làm cho tinh thần để suy nghĩ lại chiến lược kiên trì của bạn ..... hạn chế tùy ý như thế này luôn luôn có vẻ giống như một chút của một mùi mã với tôi.

Các vấn đề liên quan