clojure java-interop

clojure - Añadir constructor para deftype crear clase



java-interop (2)

A los efectos de la interoperabilidad con Java, necesito una clase que tenga un constructor nullary que realice la inicialización. Los objetos de esta clase necesitan tener algo parecido a campos de Java mutables (es decir, el objeto representa el back-end de un juego y necesita mantener el estado del juego).

deftype hace todo lo que quiero hacer, excepto proporcionar un constructor nullary (ya que estoy creando una clase con campos).

No necesito que los campos sean legibles públicamente, así que puedo pensar en 4 soluciones:

Use gen-class; No quiero hacer esto si puedo evitarlo.
De alguna manera, la codificación de variables de miembros privados fuera del conocimiento de deftype; Me han dicho que esto no se puede hacer.
Escribir un deftype modificado que también crea un constructor nullary; francamente, no sé clojure lo suficientemente bien para esto.
Tomando la clase creada por deftype y de alguna manera añadiéndole un nuevo constructor.

Al final de esto, necesito tener una clase Java, ya que la entregaré al código Java que creará un nuevo objeto de la clase.

¿Son viables algunas de las soluciones que sugerí (o cualquiera de las que no he pensado) además de usar gen-class?


Sugeriría simplemente escribir el objeto en Java: para objetos similares a Java con campos mutables, probablemente sea más elegante, comprensible y práctico.

En general, he tenido muy buenos resultados mezclando código Java y Clojure en proyectos. Este parece uno de esos casos en los que esto podría ser apropiado. La interoperabilidad es tan buena que apenas tiene una complejidad adicional.

Por cierto, supongo que necesitas un constructor nullary para cumplir con los requisitos de alguna biblioteca de persistencia o algo similar. Parece que es un requisito extraño de lo contrario. Si este es el caso, entonces puede que tenga sentido replantearse su estrategia de persistencia ... las restricciones arbitrarias como esta siempre me parecen un poco olorosas a código.


No hay ninguna vergüenza, en su caso, escribiendo una pizca de Java si sus requisitos de interoperabilidad de Java son simultáneamente específicos e inquebrantables. Podría escribir una clase Java con un único método de fábrica estático que devuelva una instancia de la clase deftype y que haga la inicialización / configuración que necesite.

Alternativamente, puede escribir una función de factoría nullary en Clojure y llamarla directamente desde Java durante todo el día.

En cualquier caso, ni deftype ni defrecord están destinados (o nunca serán) instalaciones de interoperabilidad con todas las funciones. gen-class ciertamente viene más cerca, y es por eso que ha sido recomendado.