如何使用Clojure'创建多个Java成员变量;s世代

如何使用Clojure'创建多个Java成员变量;s世代,java,clojure,clojure-java-interop,Java,Clojure,Clojure Java Interop,关于Clojure Java interop的一个非常古老的问题,解释了如何使用gen class和:state和:init关键字创建一个可从Java访问的公共实例变量。如果Java类只需要一段数据,或者可以要求Java类使用访问器函数来读取(例如)存储在状态变量中的映射,那么这就足够了。此方法还允许更改数据,例如通过在状态变量中存储atoms 如果我想创建多个在Java类中直接可读的实例变量,该怎么办?这可能吗?例如,我可以编译以下文件并执行Bar类,然后查看打印出来的foo.Bar的值42

关于Clojure Java interop的一个非常古老的问题,解释了如何使用
gen class
:state
:init
关键字创建一个可从Java访问的公共实例变量。如果Java类只需要一段数据,或者可以要求Java类使用访问器函数来读取(例如)存储在状态变量中的映射,那么这就足够了。此方法还允许更改数据,例如通过在状态变量中存储
atom
s

如果我想创建多个在Java类中直接可读的实例变量,该怎么办?这可能吗?例如,我可以编译以下文件并执行
Bar
类,然后查看打印出来的
foo.Bar
的值42

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);
    }
}

如果我取消注释
baz
行,Bar.java将不会编译——编译器似乎会随机创建
Bar
baz
作为
Foo
的状态变量,因此只有其中一个可用于
Bar
。无论如何,我不知道如何使用
init
函数初始化
bar
baz

gen class宏不支持定义多个公共字段。您必须改用
defrecord
宏或
deftype

(defrecord Foo [bar baz])

不幸的是,
defrecord
宏和
deftype
宏都没有准备定义其构造函数的方法。因此,在必须初始化多个实例变量的情况下,用Java编写Java类并没有什么丢脸的。

谢谢。没有羞耻,但没有乐趣;我更喜欢写Clojure。真令人失望。考虑到Clojure为与Java交互提供的所有功能,这似乎是一个任意的限制。幸运的是,多个实例变量对我来说可能不是必需的,但我想知道。基于,
gen class
可能是我当前项目的最佳选择。