CLOVER🍀

That was when it all began.

ClojureでJavaクラスのフィールドに値を設定する

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