Clojureで、Javaクラスのフィールドから値を読み出すことはよくありましたが、そういえば値の設定はやったことがありませんでした。
メソッド呼び出しのように
(.field-name instance-name value)
みたいな感じで書くのかな?と思いきや、ちょっと違う模様。
Special Form、set!を使います。
サンプルとして、こんなJavaソースコードを用意。
Hoge.java
public class Hoge { public static String staticValue; public String value; }
まあ、大したものではありません。
では、Clojure側。
(def h (Hoge.)) (println (.value h)) ;; => nil (set! (.value h) "Hello World") (println (.value h)) ;; => Hello World (set! (. h value) "Hello Clojure") (println (.value h)) ;; => Hello Clojure (println (Hoge/staticValue)) ;; => nil (set! (Hoge/staticValue) "Hello Static World") (println (Hoge/staticValue)) ;; => Hello Static World (set! (. Hoge staticValue) "Hello Static Clojure") (println (Hoge/staticValue)) ;; => Hello Static Clojure
あとは、見たまんまですね。
Clojure Document「Java Interop」
http://clojure.org/java_interop