见下面的程序,这个回调是怎么发生的啊?从程序中怎么看不出逻辑,都没有调用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 ( ) ;
}
}
簡単に言うと、フィルタをリストに追加するときに、フィルタで定義された条件を使用して処理が行われます
リーリーaccept
メソッドはfile.list
で呼び出されます。File
クラスのソース コードを開いて、呼び出しプロセスを明確に確認できます。以下は、File
クラスからコピーしたlist
メソッドです。コールバックの意味は、インターフェイス (インターフェイスである必要はありません) を実装しますが、このインターフェイスを呼び出すのではなく、このインターフェイスを定義する側 (これは Java クラス ライブラリを参照する必要があります) を呼び出すことを意味します。あなたが与えた実装。
要件を満たすサブディレクトリを一覧表示する操作にはいくつかの手順が含まれており、その一部は変更されていません (たとえば、最初に現在のディレクトリ内のすべてのサブディレクトリを取得する必要があります。ソース コードは見ていませんが、そうであるはずです)これらは、Java クラス ライブラリで実装されます。このステップに対応するのは変更操作、つまりサブディレクトリがどのような条件を満たすようにするかという操作です。したがって、クラス ライブラリは、変更のこの部分を実装するためのインターフェイスとして設計し、
File.list()
を通じてコールバックを登録します。あなたが電話しないから、それがコールバックと呼ばれるのです - 電話しないでください、私が折り返し電話します
または、より直接的には、
accept(File, String)
の呼び出しはFile.list(FilenameFilter)
関数内で発生します。関数内では、パラメーターdir
とname
が指定した実装に渡されます。つまり、accept(File, String)
メソッドが呼び出されます。