我在学习 Clojure 并目前在对 Swing 和 Java 互操作性进行实验。我拥有如下的 namespace
(ns test.core
(:gen-class
:name Testing
:extends javax.swing.JFrame
:init init
:state state
:constructors {[String] [String]})
(:import (javax.swing JFrame)))
(defn -init [x]
[[x] ()])
因此我现在可以用 (let [jf (Testing. "example jframe")].. 来实例化一个 JFrame
我在 :gen-class 中使用的 :init、:state 和 :constructors 标签上有点迷茫。
1) 在这个例子中我需要使用 :state 吗?从我理解来看这
https://docs.clojure.org/clojure.core/gen-class
以及在注释中 "com.example" 的代码中,:state 用于允许对本来不可变的对象进行更改,通过创建一个新的带有更改状态的对象。但在我上面的例子中 JFrame 已经是可变的,因此其实没有必要使用 :state。我的这个想法对吗?
2) :init 是一个返回包含父类构造函数参数和状态的向量的函数。:constructors 的具体用途是什么?我能定义一个自定义的构造函数,使其调用父类构造函数,就像在 Java 中做的那样吗?或者这是不可能的,我应该只初始化对象后调用一个单独的函数,例如
(let [jf (Testing. "example jframe")]
(doto jf
(.setSize 200 300)
(.setVisible true)
etc..
提前感谢