2011-06-29 29 views
11

Do celów współpracy z Javą potrzebuję klasy, która ma zerowy konstruktor wykonujący inicjalizację. Obiekty tej klasy muszą mieć coś przypominającego zmienne pola java (tzn. Obiekt reprezentuje zaplecze gry i musi zachować stan gry).Dodaj konstruktora do klasy utworzonego typu deftype

deftype robi wszystko chcę zrobić wyjątkiem zapewnić sygnalnych konstruktora (ponieważ tworzę klasę z polami).

nie muszę pól być publicznie czytelny, więc mogę myśleć o 4 rozwiązania:

Korzystanie GEN-klasie; Nie chcę tego robić, jeśli mogę tego uniknąć.
Jakoś kodowanie prywatnych zmiennych członkowskich poza wiedzą o typie deftype; Powiedziano mi, że nie da się tego zrobić.
Zapisywanie zmodyfikowanego deftype, który również tworzy konstruktor nullary; szczerze mówiąc, nie znam się na tym wystarczająco dobrze.
Przenoszenie klasy stworzonej przez deftype i jakoś dodanie do niej nowego konstruktora.

Na koniec muszę mieć klasę Java, ponieważ będę przekazywał ją do kodu Java, który będzie robił nowy obiekt z klasy.

Czy któreś z rozwiązań, które zasugerowałem (lub o których nie myślałem), inne niż wykorzystanie klasy genowej jest wykonalne?

+0

Wydaje się, że tworzenie konstruktora znajduje się głęboko w kodzie klienckim clojure. Więc modyfikowanie samego deftype brzmi trochę trudniej i nieco złym pomysłem. –

+0

w jaki sposób pola będą dostępne, a instancja wygenerowała metodę yourClass.newInstance() i odbicie? TAK być może wiedząc więcej o użyciu strony Java dla wygenerowanej klasy, w przeciwnym razie trochę się boję, że czas na gen-klasę :( –

Odpowiedz

3

Nie ma absolutnie żadnego wstydu, jeśli jest to właściwe, napisanie odrobiny Javy, jeśli wymagania Java są jednocześnie specyficzne i niewzruszone. Można napisać klasę Java za pomocą pojedynczej statycznej metody fabryki, która zwróci instancję klasy deftype i wykona dowolną inicjalizację/konfigurację, której potrzebujesz.

Alternatywnie można napisać funkcję nullary factory w Clojure i wywoływać ją bezpośrednio z Javy przez cały dzień.

Tak czy inaczej, ani deftype, ani defrecord nie mają być (ani nigdy nie będą) w pełni wyposażonymi obiektami międzyoperacyjnymi. gen-class z pewnością jest najbliżej, dlatego jest zalecane.

2

Proponuję tylko napisanie obiektu w Javie - dla obiektów podobnych do Java z zmiennymi polami będzie prawdopodobnie bardziej elegancki, zrozumiały i praktyczny.

Generalnie miałem całkiem dobre wyniki, łącząc kod Java i Clojure w projektach. Wydaje się, że jest to jeden z tych przypadków, w których może to być właściwe. Interoperacyjność jest tak dobra, że ​​prawie nie ma żadnej dodatkowej złożoności.

BTW - Zakładam, że potrzebujesz konstruktora nullary spełniającego wymagania jakiejś biblioteki uporczywości lub czegoś podobnego? W przeciwnym razie wydaje się dziwnym wymogiem. Jeśli tak jest, to może się okazać, że warto przemyśleć swoją strategię trwałości ... Takie arbitralne ograniczenia zawsze wydają mi się trochę dziwne.

Powiązane problemy