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