JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java 新手區  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 請問一下 Closure 跟 Callback 是什麼? [精華]
HuSeila





發文: 109
積分: 1
於 2004-07-05 14:01 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
書上提到這兩個機制,說 Closure 是"一種可被呼叫的物件,它會記錄一些資訊,這些資訊來自它的產生地所在的程式範疇",這樣我還是無法知道 Closure 長什麼樣子而且要用來作什麼?至於 Callback 我第一想到是一個函數內部會呼叫自己的機制,不知道是不是這樣??

下面是書上的範例,我將我猜測的 Callback 跟 Closure 註解一下,不知道對不對 ...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
//Callbacks.java
 
interface Incrementable
{
    void increment();
}
 
class Callee1 implements Incrementable
{
    private int i=0;
    public void increment()
    {
        i++;
        System.out.println(i); 
    } 
}
 
class MyIncrement
{
    public void increment()
    {
        System.out.println("Other operation");
    }
    public static void f(MyIncrement mi)
    {
        mi.increment();                             // 這個是不是 Callback??
    }
}
 
class Callee2 extends MyIncrement
{
    private int i=0;
    private void incr()
    {
        i++;
        System.out.println(i);
    }
    private class Closure implements Incrementable  //這個名稱是 Closure,
    {                                                                 //不過為什麼呢??
        public void increment() { incr(); }     // <---- 這個是 callback ??    
    }
    Incrementable getCallbackReference()
    {
        return new Closure();
    }
    
}
 
class Caller
{
    private Incrementable callbackReference;
    Caller(Incrementable cbh)
    {
        callbackReference=cbh;
    }
    void go()
    {
        callbackReference.increment();   
    }
}
 
public class Callbacks
{
    public static void main(String[] args)
    {
        Callee1 c1=new Callee1();
        Callee2 c2=new Callee2();
        MyIncrement.f(c2);
        Caller caller1=new Caller(c1);
        Caller caller2=new Caller(c2.getCallbackReference());
        caller1.go();
        caller1.go(); 
        caller2.go();
        caller2.go(); 
    }
}


這個程式提到在 class callee2 中 interface 與許實做與介面的完全分離,介面是指 getCallbackReference( ),實做是指 incr( )嗎?並說"Caller 於其建構式中接受 Incrementable reference 作為引數(儘管捕獲 callback reference 的動作隨時會發生),而且在某段時間之後,它會使用這個 reference 來回頭呼叫 Callee class(?是指 go 函式的行為嗎??)。callback 的價值在於其彈性 -- 你可以在執行時期動態決定究竟要呼叫哪一個函式 ..."

這段話裡 "儘管捕獲 callback reference 的動作隨時會發生" 這句不知道是什麼意思,而"在執行時期動態決定究竟要呼叫哪一個函式"在這個範例裡有表現出來嗎?感覺好像沒有 ..

不好意思又問一堆,不過根本上是我對於 Closure 和 Callback 不清楚造成的,還請各位能給我一些指導,謝謝!


reply to postreply to post
作者 Re:請問一下 Closure 跟 Callback 是什麼? [Re:HuSeila]
popcorny

Jakarta 2%

版主

發文: 752
積分: 20
於 2004-07-05 17:19 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
不知道你的書為什麼特別提到這兩個字眼
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所產生的物件
在下面的程式碼中
1
2
3
4
    Incrementable getCallbackReference()
    {
        return new Closure();
    }

當Closure的instance被產生出來時
他也會綁住他的outer class的Callee2的instance
所以在呼叫Closure的incr()時
他會知道使用的是哪一個Callee2的i
這就是這個例子所要表達的closure的精神

至於callback
我認為不論是Callee1所實作的increment
跟Callee2.Closure所實作的increment
都可以算是callback method

jakarta的Collection也有定義一個Closure的class
給你做一個參考


reply to postreply to post
作者 Re:請問一下 Closure 跟 Callback 是什麼? [Re:HuSeila]
HuSeila





發文: 109
積分: 1
於 2004-07-05 20:07 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
您好,我看的是Thinking in Java,我讀到 inner class 部分時書上提出用 inner class 的方法模擬出類似 closure 和 callback 的機制(p391),目前我還不是能完全瞭解書上的內容,所以也無從判斷這樣的機制是否需要以及這是不是一個好的作法 ... 有興趣的各位可以在這本書找到相關內容 ..

reply to postreply to post
作者 Re:請問一下 Closure 跟 Callback 是什麼? [Re:HuSeila]
HuSeila





發文: 109
積分: 1
於 2004-07-07 21:46 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
不好意思,我仔細看過 popcorny 的解釋之後,還是有幾個問題:

1.所謂的系統呼叫是指怎樣的形式?它跟一般我們用物件呼叫有什麼明顯看起來能夠判別的地方?因為這裡的 increment() 雖然是經過 Caller 呼叫 go() (感覺繞了一圈) 被喚起的,但我感覺還是物件呼叫,體會不出系統呼叫 ..

2.java 要模擬 closure 只能用含一個 method 的 interface 的理由是?

另外對於介面與實做完全分離的問題,現在又感覺是 caller class 的貢獻,這裡我想請問的是造成介面與實做分離的關鍵因素是哪部分呢??

麻煩各位了,現在好像是有點瞭解又好像不是很清楚的感覺,感謝!


reply to postreply to post
作者 Re:請問一下 Closure 跟 Callback 是什麼? [Re:HuSeila]
popcorny

Jakarta 2%

版主

發文: 752
積分: 20
於 2004-07-07 21:59 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
HuSeila wrote:
1.所謂的系統呼叫是指怎樣的形式?它跟一般我們用物件呼叫有什麼明顯看起來能夠判別的地方?因為這裡的 increment() 雖然是經過 Caller 呼叫 go() (感覺繞了一圈) 被喚起的,但我感覺還是物件呼叫,體會不出系統呼叫 ..

這邊這個"系統呼叫"並不是一個專有名詞啦
我指的是被一個別人的系統呼叫
(很抱歉 我不知道要怎麼清楚的表達這一塊)
舉個實例好了
我門寫AWT/Swing的程式常常會寫一些XXXListener
裡面我們所實作的method都可以說是callback method
這些method是被AWT/Swing裡面的GUI widget所呼叫
這就可以想說是被別的系統(AWT/Swing)所使用


2.java 要模擬 closure 只能用含一個 method 的 interface 的理由是?

closure是一個function
如果我們要以物件導向的思維去看一function
那當這個Closure的inteface是只有一個method的inteface
而那個method就代表那個function


另外對於介面與實做完全分離的問題,現在又感覺是 caller class 的貢獻,這裡我想請問的是造成介面與實做分離的關鍵因素是哪部分呢??
麻煩各位了,現在好像是有點瞭解又好像不是很清楚的感覺,感謝!

一個介面可以有很多種實作
我們可以以一致的介面去操作不同的實作
這是物件導向多型(polymorphism)的精神


reply to postreply to post
作者 Re:請問一下 Closure 跟 Callback 是什麼? [Re:HuSeila]
T55555

Java, Ruby, Haskell

版主

發文: 1026
積分: 24
於 2004-09-14 21:51 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
剛剛看到有關的一篇:
http://martinfowler.com/bliki/Closures.html

(BTW: 他寫的 Ruby code 可以再簡短 Wink )


reply to postreply to post
作者 Re:請問一下 Closure 跟 Callback 是什麼? [Re:HuSeila]
metavige

metavige

版主

發文: 2134
積分: 10
於 2004-09-15 09:20 user profilesend a private message to usersend email to metavigereply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
最近有在看 Inversion of Controll 以及 Dependence Injection 的文章
感覺上 CallBack Method 就好像這些東西

宣告好一些 Method,等到需要的時候
自然就會有另外的程式來呼叫

又或者像是 Observer 的 notify
當物件發生變化時,就會利用類似 CallBack 的方式
去通知相關的物件

臨時聯想到的.....


reply to postreply to post
請各位新手參考 論壇規範Java 新手 FAQ
» JWorld@TW »  Java 新手區

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8