2015-05-01 8 views
6

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.

risposta

2

La macro gen-class non supporta la definizione di più di un campo pubblico. È necessario utilizzare la macro defrecord o la macro deftype.

(defrecord Foo [bar baz]) 

Purtroppo, sia il defrecord macro e la macro deftype non significa preparare un modo per definire i loro costruttori. Quindi, quando l'inizializzazione di più variabili di istanza è obbligatoria, non c'è vergogna nello scrivere una classe Java in Java.

+0

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

+0

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

Problemi correlati