熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java的回調函數

2013-11-23 19:13:36  來源: Java核心技術 
    講到回調函數這個概念給大家普及下 所謂回調函數就是指這個函數先在某處注冊而它將在稍後某個需要的時候被調用比如在利用SDK 進行Windows編程的時候我們需要注冊一個WNDCLASS類這個類中有這樣一個參數lpfnWndProc 要進行消息處理我們就要用處理消息的函數的指針給它賦值消息處理函數什麼時候被調用的?我們沒有顯式地在程序中看到啊是OS調用的這是SDK的試驗方式當然用的是過程式的語言C可以通過傳遞函數的指針實現
   
    C++中怎麼來實現呢?當然C++兼容C用函數指針就可以同時C++又提供了面向對象的機制可不可以有不同的實現機制呢?當然!STL 中的functor(Function object)就可以用到回調上比如對一個存放int數據的vector進行遞減排序的話我們可以這樣進行
   
    sort(vecbegin()vecend()greater<int>())
   
    greater<int>()
   
    就是我們傳遞的一個匿名對象它重載了函數調用運算符()我們沒有顯式地調用這個對象裡面提供的函數sort函數對對象裡面的函數進行call backJava中要實現類似functor的功能應該怎麼辦呢?Command模式可以幫上忙Command模式看起來很簡單只要把command封裝到一個接口中就可以Command模式是回調機制的一個面向對象的替代品比如javaio 中已經定義好的一個接口
   
    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){
   
    thisafn = afn;
   
    }
   
    public boolean accept(File dir String name){
   
    String f = new File(name)getName()
   
    return findexOf(afn) != ;
   
    }
   
    }
   
    怎麼樣使用它呢?File類中有這樣一個方法
   
    public String[] list(FilenameFilter filter)
   
    因此我們就可以這樣做了
   
    File file = new File(
   
    String[] list = filelist(new DirFilter(wf))
   
    得到的list就是一個當然目錄中所有包含字符串wf的文件名稱的字符串數組怎麼樣看起來是不是和C++中的functor差不多呢?


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26476.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.