2011-06-29 9 views
11

Para fines de 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).Añadir constructor para deftype clase creada

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

No necesito los campos para ser legible públicamente, por lo que puedo pensar en soluciones: 4

Uso generación de clase; No quiero hacer esto si puedo evitarlo.
Codificando de algún modo 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 voy a entregarla al código Java que creará un nuevo objeto de la clase.

¿Alguna de las soluciones que sugerí (o cualquiera que no haya pensado) además de usar gen-class es viable?

+0

Parece que la creación del constructor está en el interior del código java de clojure. Así que modificar el tipo de definición en sí suena un poco difícil y una mala idea. –

+0

¿cómo se accederá a los campos y la instancia generada yourClass.newInstance() y reflexión? ASÍ QUE quizás saber más sobre el uso del lado de Java para la clase generada ayudará, de lo contrario, tengo miedo de que sea hora de gen-class :( –

Respuesta

3

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 realice la inicialización/configuración que necesite.

O bien, puede escribir una función de fábrica nullary en Clojure, y llamarla directamente desde Java durante todo el día.

En cualquier caso, ni deftype ni defrecord están destinados a ser (o van a ser) instalaciones interoperativas con todas las funciones. gen-class ciertamente es lo más cercano, y es por eso que ha sido recomendado.

2

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 buenos resultados al mezclar 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.

BTW - Supongo que necesita 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.

Cuestiones relacionadas