java - FilenameFilter接口中,accept 方法回调问题
迷茫
迷茫 2017-04-17 17:27:02
0
3
1455
  1. 见下面的程序,这个回调是怎么发生的啊?从程序中怎么看不出逻辑,都没有调用accept ()?

import java . io . File ;
import java . io . * ;
import java . util . * ;
import java . util . regex . * ;


public class DirList
{
        public static void main (String [ ] args)
        {
                File path = new File (".") ; 
                String[ ] list ;
                if ( args . length == 0 )
                {
                        list = path . list ( ) ;
                }
                else 
                {
                        list = path . list (new DirFilter ( args [ 0 ])) ; 
                }
                Arrays . sort (list , String . CASE_INSENSITIVE_ORDER );
                for (String dirItem : list ) 
                    System . out . println (dirItem) ;        
        }
}

class DirFilter implements FilenameFilter 
{
        private Pattern pattern ; 
        public DirFilter ( String regex )
        {
                pattern = pattern . compile ( regex );
        }
        
        public boolean accept ( File dir , String name )
        {
                return pattern . matcher ( name ) . matches (  ) ;
        }
}
迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回覆(3)
左手右手慢动作

簡單說就是在list的時候,用你filter 中定義的條件發生的

迷茫

accept方法在file.list里面调用的,楼主可以打开File类的源代码,很清楚的看到调用流程,下面是我从File类里面复制出来的list方法

    public String[] list(FilenameFilter filter) {
        String names[] = list();
        if ((names == null) || (filter == null)) {
            return names;
        }
        List<String> v = new ArrayList<>();
        for (int i = 0 ; i < names.length ; i++) {
            if (filter.accept(this, names[i])) {
                v.add(names[i]);
            }
        }
        return v.toArray(new String[v.size()]);
    }
左手右手慢动作

回調的意思就是,你實作一個接口(不一定非得是接口),但不去呼叫這個接口,而是讓定義這個接口的一方(這裡應該指Java類庫)去呼叫你給的實作。

list出滿足要求的子目錄這個操作,涉及若干步驟,有些是不變的(比如都需要先得到當前目錄下的所有子目錄,沒有看過源碼,但應該是OS的系統調用),這些都實作在Java類別庫裡的。與這個步驟對應的是變化的操作,也就是你要子目錄滿足什麼條件。所以類別庫把變化的這部分設計成接口,讓你去實現,你再透過File.list()去註冊你的回調。 File.list()去注册你的回调。

因为你不调用,所以才叫回调呀 - don't call me, I'll call back


或者更直接一点,accept(File, String)的调用发生在File.list(FilenameFilter)函数内。在函数内,会将参数dirname传递给你给的实现,也就是调用accept(File, String)

因為你不調用,所以才叫回調呀 - don't call me, I'll call back🎜
🎜或更直接一點,accept(File, String)的呼叫發生在File.list(FilenameFilter)函數內。在函數內,會將參數dirname傳遞給你給的實現,也就是呼叫accept(File, String)方法。 🎜
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!