我正在学习Clojure,目前正在尝试Swing与Java互操作性。我有这个命名空间
(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..
提前感谢