见下面的程序,这个回调是怎么发生的啊?从程序中怎么看不出逻辑,都没有调用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 ( ) ;
}
}
Pour faire simple, cela se produit en utilisant les conditions définies dans votre filtre lorsque vous l'ajoutez à la liste
La méthode
accept
est appelée dansfile.list
Vous pouvez ouvrir le code source de la classeFile
et voir clairement le processus d'appel. Vous trouverez ci-dessous la méthodeFile
que j'ai copiée à partir de la classelist
.La signification du rappel est que vous implémentez une interface (pas nécessairement une interface), mais n'appelez pas cette interface, mais laissez la partie qui définit cette interface (cela devrait faire référence à la bibliothèque de classes Java) appeler l'implémentation que vous avez donnée .
L'opération de listage des sous-répertoires qui répondent aux exigences implique plusieurs étapes, dont certaines restent inchangées (par exemple, vous devez d'abord récupérer tous les sous-répertoires du répertoire courant. Je n'ai pas vu le code source, mais il devrait l'être un appel système du système d'exploitation). Ceux-ci sont implémentés dans les bibliothèques de classes Java. À cette étape correspond l’opération de changement, c’est-à-dire quelles conditions souhaitez-vous que le sous-répertoire remplisse. Par conséquent, la bibliothèque de classes conçoit cette partie du changement comme une interface que vous pouvez implémenter, puis vous enregistrez votre rappel via
File.list()
.Parce que vous n'appelez pas, c'est pourquoi cela s'appelle un rappel - ne m'appelez pas, je vous rappellerai
Ou plus directement, l'appel de
accept(File, String)
se produit au sein de la fonctionFile.list(FilenameFilter)
. Au sein de la fonction, les paramètresdir
etname
seront transmis à l'implémentation que vous avez donnée, c'est-à-dire que la méthodeaccept(File, String)
sera appelée.