註冊 | 登入 | 全文檢索 | 排行榜 |
![]() |
» JWorld@TW
» Java 新手區
![]() ![]() |
![]() ![]() ![]() ![]() |
本主題所含的標籤 |
作者 | Re:請問一下 Closure 跟 Callback 是什麼? [Re:HuSeila] | ||
popcorny
![]() Jakarta 2% 版主 ![]() 發文: 752 積分: 20 ![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() 不知道你的書為什麼特別提到這兩個字眼 callback還算比較常見的術語 而closure好像在java的領域比較少人提到 我以我所知的跟你解釋好了 有錯還請各位指正 Callback(回呼): 通常是指一個function 此function並非被你自己所寫的應用程式呼叫 而是被系統呼叫 至於這個系統可能是作業系統 或是一個container(servlet container, ejb container之類的) 或是其他形式 舉個例子 我們寫servlet的時候 在繼承HttpServlet之後 要撰寫doGet()或doPost()這些method 我們都可以把這些叫做callback method 另外 我們寫的public static void main 這個也可以視為一個callback function 因為他是被jvm啟動時所呼叫的method callback並沒有一定的撰寫形式 而這個字只是強調他被使用的方式而已 Closure(中文不知道怎麼翻 @@"): 其實他也是一種function 但是他的功能比較是拿來當參數傳遞的用途 有些語言直接提供function的傳遞 像是所有的functional language(scheme, lisp,..), pascal 還有c/c++的function pointer勉強也算是 在其中我們可以傳遞一個function當參數給另一個function做使用 至於為什麼要叫closure呢? 因為他在傳遞的過程中 還"包住"了一些環境的資訊 當然最基本的code的位址 再者就是產生此closure的環境 最主要的是變數.. (越講越模糊了..@@") 那以你的code來解釋好了 如你所提供的code所示 在java中如果要模擬closure可以使用只有一個method的interface來模擬 這個Interface就是Incremental 而closure就是Closure這個class所產生的物件 在下面的程式碼中
當Closure的instance被產生出來時 他也會綁住他的outer class的Callee2的instance 所以在呼叫Closure的incr()時 他會知道使用的是哪一個Callee2的i 這就是這個例子所要表達的closure的精神 至於callback 我認為不論是Callee1所實作的increment 跟Callee2.Closure所實作的increment 都可以算是callback method jakarta的Collection也有定義一個Closure的class 給你做一個參考 ![]() ![]() |
作者 | Re:請問一下 Closure 跟 Callback 是什麼? [Re:HuSeila] |
HuSeila
![]() ![]() ![]() ![]() ![]() ![]() 發文: 109 積分: 1 ![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() 您好,我看的是Thinking in Java,我讀到 inner class 部分時書上提出用 inner class 的方法模擬出類似 closure 和 callback 的機制(p391),目前我還不是能完全瞭解書上的內容,所以也無從判斷這樣的機制是否需要以及這是不是一個好的作法 ... 有興趣的各位可以在這本書找到相關內容 .. ![]() ![]() |
作者 | Re:請問一下 Closure 跟 Callback 是什麼? [Re:HuSeila] |
HuSeila
![]() ![]() ![]() ![]() ![]() ![]() 發文: 109 積分: 1 ![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() 不好意思,我仔細看過 popcorny 的解釋之後,還是有幾個問題: 1.所謂的系統呼叫是指怎樣的形式?它跟一般我們用物件呼叫有什麼明顯看起來能夠判別的地方?因為這裡的 increment() 雖然是經過 Caller 呼叫 go() (感覺繞了一圈) 被喚起的,但我感覺還是物件呼叫,體會不出系統呼叫 .. 2.java 要模擬 closure 只能用含一個 method 的 interface 的理由是? 另外對於介面與實做完全分離的問題,現在又感覺是 caller class 的貢獻,這裡我想請問的是造成介面與實做分離的關鍵因素是哪部分呢?? 麻煩各位了,現在好像是有點瞭解又好像不是很清楚的感覺,感謝! ![]() ![]() |
作者 | Re:請問一下 Closure 跟 Callback 是什麼? [Re:HuSeila] |
popcorny
![]() Jakarta 2% 版主 ![]() 發文: 752 積分: 20 ![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() HuSeila wrote: 這邊這個"系統呼叫"並不是一個專有名詞啦 我指的是被一個別人的系統呼叫 (很抱歉 我不知道要怎麼清楚的表達這一塊) 舉個實例好了 我門寫AWT/Swing的程式常常會寫一些XXXListener 裡面我們所實作的method都可以說是callback method 這些method是被AWT/Swing裡面的GUI widget所呼叫 這就可以想說是被別的系統(AWT/Swing)所使用
closure是一個function 如果我們要以物件導向的思維去看一function 那當這個Closure的inteface是只有一個method的inteface 而那個method就代表那個function
一個介面可以有很多種實作 我們可以以一致的介面去操作不同的實作 這是物件導向多型(polymorphism)的精神 ![]() ![]() |
作者 | Re:請問一下 Closure 跟 Callback 是什麼? [Re:HuSeila] |
T55555
![]() Java, Ruby, Haskell 版主 ![]() 發文: 1026 積分: 24 ![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() 剛剛看到有關的一篇: http://martinfowler.com/bliki/Closures.html (BTW: 他寫的 Ruby code 可以再簡短 ![]() ![]() ![]() |
作者 | Re:請問一下 Closure 跟 Callback 是什麼? [Re:HuSeila] |
metavige
![]() metavige 版主 ![]() 發文: 2134 積分: 10 ![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 最近有在看 Inversion of Controll 以及 Dependence Injection 的文章 感覺上 CallBack Method 就好像這些東西 宣告好一些 Method,等到需要的時候 自然就會有另外的程式來呼叫 又或者像是 Observer 的 notify 當物件發生變化時,就會利用類似 CallBack 的方式 去通知相關的物件 臨時聯想到的..... ![]() ![]() 請各位新手參考 論壇規範 跟 Java 新手 FAQ |
» JWorld@TW » Java 新手區 |
![]() ![]() ![]() ![]() |
![]() ![]() ![]() |