见下面的程序,这个回调是怎么发生的啊?从程序中怎么看不出逻辑,都没有调用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 ( ) ;
}
}
簡單說就是在list的時候,用你filter 中定義的條件發生的
accept
方法在file.list
里面调用的,楼主可以打开File
类的源代码,很清楚的看到调用流程,下面是我从File
类里面复制出来的list
方法回調的意思就是,你實作一個接口(不一定非得是接口),但不去呼叫這個接口,而是讓定義這個接口的一方(這裡應該指Java類庫)去呼叫你給的實作。
list出滿足要求的子目錄這個操作,涉及若干步驟,有些是不變的(比如都需要先得到當前目錄下的所有子目錄,沒有看過源碼,但應該是OS的系統調用),這些都實作在Java類別庫裡的。與這個步驟對應的是變化的操作,也就是你要子目錄滿足什麼條件。所以類別庫把變化的這部分設計成接口,讓你去實現,你再透過
File.list()
去註冊你的回調。File.list()
去注册你的回调。因为你不调用,所以才叫回调呀 - don't call me, I'll call back
或者更直接一点,
因為你不調用,所以才叫回調呀 - don't call me, I'll call back🎜accept(File, String)
的调用发生在File.list(FilenameFilter)
函数内。在函数内,会将参数dir
和name
传递给你给的实现,也就是调用accept(File, String)
🎜或更直接一點,
accept(File, String)
的呼叫發生在File.list(FilenameFilter)
函數內。在函數內,會將參數dir
和name
傳遞給你給的實現,也就是呼叫accept(File, String)
方法。 🎜