This answer关于Clojure-Java互操作的一个非常古老的问题解释了如何使用gen-class
与:state
和:init
关键字来创建可从以下位置访问的单个公共实例变量Java的。如果您只需要一个可用于Java类的数据,或者您可以要求Java类使用读取函数(例如,存储在状态变量中的映射),这就足够了。该方法还允许数据改变,例如,将atom
存储在状态变量中。
如果我想创建多个可在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
作为{{的状态变量1}},因此Foo
只能使用其中一个。无论如何,我都不知道如何使用Bar
函数初始化bar
和baz
。