3 回答

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超5個(gè)贊
accept
方法在file.list
里面調(diào)用的,樓主可以打開File
類的源代碼,很清楚的看到調(diào)用流程,下面是我從File
類里面復(fù)制出來的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()]);
}

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超6個(gè)贊
回調(diào)的意思就是,你實(shí)現(xiàn)一個(gè)接口(不一定非得是接口),但不去調(diào)用這個(gè)接口,而是讓定義這個(gè)接口的一方(這里應(yīng)該指Java類庫(kù))去調(diào)用你給的實(shí)現(xiàn)。
list出滿足要求的子目錄這個(gè)操作,涉及若干步驟,有些是不變的(比如都需要首先得到當(dāng)前目錄下的所有子目錄,沒有看過源碼,但應(yīng)該是OS的系統(tǒng)調(diào)用),這些都實(shí)現(xiàn)在Java類庫(kù)里的。與這個(gè)步驟對(duì)應(yīng)的是變化的操作,也就是你要子目錄滿足什么條件。所以類庫(kù)把變化的這部分設(shè)計(jì)成接口,讓你去實(shí)現(xiàn),你再通過File.list()
去注冊(cè)你的回調(diào)。
因?yàn)槟悴徽{(diào)用,所以才叫回調(diào)呀 - don't call me, I'll call back
或者更直接一點(diǎn),accept(File, String)
的調(diào)用發(fā)生在File.list(FilenameFilter)
函數(shù)內(nèi)。在函數(shù)內(nèi),會(huì)將參數(shù)dir
和name
傳遞給你給的實(shí)現(xiàn),也就是調(diào)用accept(File, String)
方法。
添加回答
舉報(bào)