我正在学习 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..
提前感谢