【发布时间】:2015-07-11 13:02:37
【问题描述】:
This answer 对关于 Clojure-Java 互操作的一个非常古老的问题解释了如何使用 gen-class 与 :state 和 :init 关键字来创建可从 Java 访问的单个公共实例变量。如果您只需要一条数据可供 Java 类使用,或者如果您可以要求 Java 类使用读取例如存储在状态变量中的映射的访问器函数,这就足够了。此方法还允许数据更改,例如通过将atoms 存储在状态变量中。
如果我想创建多个可在 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。
【问题讨论】:
标签: java clojure clojure-java-interop