Java中的functor實現

來源:互聯網
上載者:User

文章來源:csdn 作者:wangfengsdu

  經常聽到回呼函數(callback function)這個概念, 所謂回呼函數,就是指這個函數先在某處註冊,而它將在稍後某個需要的時候被調用。比如在利用SDK 進行Windows編程的時候,我們需要註冊一個WNDCLASS類,這個類中有這樣一個參數 lpfnWndProc, 要進行訊息處理,我們就要用處理訊息的函數的指標給它賦值。訊息處理函數什麼時候被調用的?我們沒有顯式地在程式中看到啊。是OS調用的。 這是SDK的實驗方式,當然用的是過程式的語言C,可以通過傳遞函數的指標實現。

   C++中怎麼來實現呢?當然,C++相容C,用函數指標就可以。 同時C++又提供了物件導向的機制,可不可以有不同的實現機制呢? 當然! STL 中的functor(Function object)就可以用到回調上。 比如對一個存放int資料的vector進行遞減排序的話,我們可以這樣進行。

  sort(vec.begin(),vec.end(),greater<int>());
   greater<int>()
  

   就是我們傳遞的一個匿名對象,它重載了函數調用運算子“()”。我們沒有顯式地調用這個對象裡面提供的函數,sort函數對對象裡面的函數進行call back。

  Java中要實作類別似functor的功能,應該怎麼辦呢?Command模式可以幫上忙。Command模式看起來很簡單,只要把command封裝到一個介面中就可以。Command模式是回調機制的一個物件導向的替代品。

  比如 java.io 中已經定義好的一個介面

   public interface FilenameFilter {
   boolean accept(File dir, String name);
  
}

  這個FilenameFilter就是Command,實現Command的類就是ConcreteCommand。這個介面所聲明的操作 "accept" 就是看看目錄dir中的檔案name是否滿足某種要求,如果滿足就返回true,否則就返回false。這個要求是什麼呢?你要對這個介面進行實現。比如我想看看這個檔案的名稱包含不包含指定的字串,那麼就可以定義下面的類:
   class DirFilter implements FilenameFilter {
private String afn;
public DirFilter(String afn){
this.afn = afn;
}
public boolean accept(File dir, String name){
String f = new File(name).getName();
return f.indexOf(afn) != -1;
}
}

   怎麼樣使用它呢?File類中有這樣一個方法
  public String[] list(FilenameFilter filter)

  因此,我們就可以這樣做了:
  File file = new File(".");
  String[] list = file.list(new DirFilter("wf"));

  得到的list就是一個當然目錄中所有包含字串"wf"的檔案名稱的字串數組。怎麼樣,看起來是不是和C++中的functor差不多呢?

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.