Renic Lin

fun with code.

Clojure Proxy vs Reify

| Comments

Clojure的proxy和reify


這個問題是在用Clojure + awt/swing開發GUI程式時遇到的,

(為什麼用awt/swing而不用 seesaw ?因為我要用到SystemTray, seesaw沒有wrapper它,加上我的程式很小。)

用到像是JButton這種元件時,常會需要用addActionListenermethod 來 addActionListener


Java的寫法如下:
1
2
3
4
5
myJButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        // do something here
    }
});

在Clojure中有兩種寫法,分別是用proxyreify

proxy

1
2
3
4
5
(.addActionListener my-jbutton
                    (proxy [ActionListener] []
                      (actionPerformed [evt]
                        ;; (do something here)
                        )))

reify

1
2
3
4
5
(.addActionListener my-jbutton
                    (reify ActionListener
                      (actionPerformed [this evt]
                        ;; (do something here)
                        )))

proxyreify一般都是用在實作interfaces,參考網路上的幾篇文章,講到平常大部份都使用時都用reify就好,
除了一些特別的用途才用proxy。(ig. override base class methods)

很大概的找一下資料,要再更深入研究一下proxyreify的異同和主要用在哪些不一樣的地方。


參考

Comments