为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕妹3146593 2019-03-21 18:15:11
见下面的程序,这个回调是怎么发生的啊?从程序中怎么看不出逻辑,都没有调用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 回答

?
四季花海

TA贡献1811条经验 获得超5个赞

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()]);

    }


查看完整回答
反对 回复 2019-04-17
?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

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

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

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


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


查看完整回答
反对 回复 2019-04-17
?
MYYA

TA贡献1868条经验 获得超4个赞

简单说就是在list的时候,用你filter 中定义的条件发生的


查看完整回答
反对 回复 2019-04-17
  • 3 回答
  • 0 关注
  • 771 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号