见下面的程序,这个回调是怎么发生的啊?从程序中怎么看不出逻辑,都没有调用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 ( ) ;
}
}
Ringkasnya, ia berlaku menggunakan syarat yang ditentukan dalam penapis anda apabila anda menambahkannya pada senarai
Kaedah
accept
dipanggil dalamfile.list
Anda boleh membuka kod sumber kelasFile
dan melihat dengan jelas proses panggilan Di bawah ialah kaedahFile
yang saya salin daripada kelaslist
.Maksud panggil balik ialah anda melaksanakan antara muka (tidak semestinya antara muka), tetapi jangan panggil antara muka ini, tetapi biarkan pihak yang mentakrifkan antara muka ini (ini harus merujuk kepada perpustakaan kelas Java) memanggil pelaksanaan yang anda berikan .
Pengendalian penyenaraian subdirektori yang memenuhi keperluan melibatkan beberapa langkah, beberapa daripadanya tidak berubah (contohnya, anda perlu mendapatkan semua subdirektori dalam direktori semasa dahulu. Saya tidak melihat kod sumber, tetapi ia sepatutnya panggilan sistem OS). Ini dilaksanakan dalam perpustakaan kelas Java. Sepadan dengan langkah ini ialah operasi perubahan, iaitu, apakah syarat yang anda mahu subdirektori itu dipenuhi. Oleh itu, pustaka kelas mereka bentuk bahagian perubahan ini sebagai antara muka untuk anda laksanakan, dan kemudian anda mendaftarkan panggilan balik anda melalui
File.list()
.Kerana anda tidak menelefon, itulah sebabnya ia dipanggil panggilan balik - jangan hubungi saya, saya akan menghubungi semula
Atau lebih langsung, panggilan
accept(File, String)
berlaku dalam fungsiFile.list(FilenameFilter)
. Dalam fungsi tersebut, parameterdir
danname
akan diserahkan kepada pelaksanaan yang anda berikan, iaitu kaedahaccept(File, String)
akan dipanggil.