FilenameFilter接口中,accept 方法回调问题
胜博发娱乐手机版
胜博发娱乐手机版
当前位置 : 胜博发娱乐手机版 > 胜博发娱乐手机客户端

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

  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    ;
        }
}

accept方法在file.list里面调用的,楼主可以打开File类的源代码,很清楚的看到调用流程,下面是我从File类里面复制出来的list方法

    public String[] listFilenameFilter 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.acceptthis, names[i] {
                v.addnames[i];
            }
        }
        return v.toArraynew String[v.size];
    }

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

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

因为你不调用,所以才叫回调呀 - dont call me, Ill call back


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

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

广告位

胜博发娱乐手机版