Maison > Questions et réponses > le corps du texte
见下面的程序,这个回调是怎么发生的啊?从程序中怎么看不出逻辑,都没有调用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 ( ) ;
}
}
ringa_lee2017-04-17 17:29:02
Pour faire simple, cela se produit en utilisant les conditions définies dans votre filtre lorsque vous l'ajoutez à la liste
迷茫2017-04-17 17:29:02
La méthode
accept
est appelée dans file.list
Vous pouvez ouvrir le code source de la classe File
et voir clairement le processus d'appel. Vous trouverez ci-dessous la méthode File
que j'ai copiée à partir de la classe 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()]);
}
ringa_lee2017-04-17 17:29:02
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 fonction File.list(FilenameFilter)
. Au sein de la fonction, les paramètres dir
et name
seront transmis à l'implémentation que vous avez donnée, c'est-à-dire que la méthode accept(File, String)
sera appelée.