This answer ad una vecchia domanda su Clojure-Java interoperabilità spiega come utilizzare gen-class
con le :state
e :init
parole chiave per creare una singola istanza pubblica variabile accessibile da Java. Questo è sufficiente se si ha bisogno di una sola parte di dati per essere disponibili nelle classi Java o se è possibile richiedere alle classi Java di utilizzare le funzioni di accesso che leggono, ad esempio, una mappa memorizzata nella variabile di stato. Questo metodo consente anche di modificare i dati, ad es. memorizzando atom
s nella variabile di stato.Come creare più variabili membro Java con Clojure di Gen-class
E se volessi creare più di una variabile di istanza direttamente leggibile in una classe Java? È possibile? Ad esempio, posso compilare i seguenti file ed eseguire la classe Bar
e vedere il valore 42 di foo.bar
stampato.
Foo.clj:
(ns students.Foo
(:gen-class
:name students.Foo
:state bar
; :state baz
:init init))
(defn -init
[]
[[] 42])
Bar.java:
package students;
public class Bar {
public static void main(String[] args) {
Foo foo = new Foo();
System.out.println(foo.bar);
// System.out.println(foo.baz);
}
}
Se togliere il commento alla baz
linee, Bar.java non verrà compilato - il compilatore sembra creare in modo casuale o bar
oppure baz
come variabile di stato per Foo
, quindi solo uno di questi è disponibile per Bar
. E in ogni caso, non vedo come inizializzare sia bar
e baz
utilizzando una funzione init
.
Grazie. Nessuna vergogna, ma niente divertimento; Preferisco scrivere Clojure. È deludente. Considerando tutte le funzionalità che Clojure fornisce per l'interazione con Java, sembra una limitazione arbitraria. Molte variabili di istanza potrebbero non essere obbligatorie per me, fortunatamente, ma volevo sapere. – Mars
Basato su [Diagramma di flusso di Emerick di Chas per la scelta del modulo di definizione del tipo Clojure corretto] (http://cemerick.com/2011/07/05/flowchart-for-choosing-the-right-clojure-type-definition-form), 'gen-class' è probabilmente l'opzione migliore per il mio progetto attuale. – Mars