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中有兩種寫法,分別是用proxy和reify。
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)
)))
|
proxy和reify一般都是用在實作interfaces,參考網路上的幾篇文章,講到平常大部份都使用時都用reify就好,
除了一些特別的用途才用proxy。(ig. override base class methods)
很大概的找一下資料,要再更深入研究一下proxy和reify的異同和主要用在哪些不一樣的地方。
參考