java - FilenameFilter接口中,accept 方法回调问题

 mobiledu2502859427 发布于 2022-10-29 22:04
  1. 见下面的程序,这个回调是怎么发生的啊?从程序中怎么看不出逻辑,都没有调用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 (  ) ;
        }
}
3 个回答
  • 简单说就是在list的时候,用你filter 中定义的条件发生的

    2022-10-31 19:36 回答
  • 回调的意思就是,你实现一个接口(不一定非得是接口),但不去调用这个接口,而是让定义这个接口的一方(这里应该指Java类库)去调用你给的实现。

    list出满足要求的子目录这个操作,涉及若干步骤,有些是不变的(比如都需要首先得到当前目录下的所有子目录,没有看过源码,但应该是OS的系统调用),这些都实现在Java类库里的。与这个步骤对应的是变化的操作,也就是你要子目录满足什么条件。所以类库把变化的这部分设计成接口,让你去实现,你再通过File.list()去注册你的回调。

    因为你不调用,所以才叫回调呀 - don't call me, I'll call back


    或者更直接一点,accept(File, String)的调用发生在File.list(FilenameFilter)函数内。在函数内,会将参数dirname传递给你给的实现,也就是调用accept(File, String)方法。

    2022-10-31 19:38 回答
  • accept方法在file.list里面调用的,楼主可以打开File类的源代码,很清楚的看到调用流程,下面是我从File类里面复制出来的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()]);
        }
    
    2022-10-31 19:38 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有