接口回调
最近遇到接口回调挺多的,例如Java Web中的Listener以及最近在回顾Java的基础知识File类里面的list(FilenameFilter)都用到了接口回调。那么我就从list(FilenameFilter filter)来浅析下接口回调
1.list(FilenameFilter filter)里的接口回调
*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++) {
//通过接口FilenameFilter去调用使用list方法实现FilenameFilter接口的类(即后面的匿名内部类)的accpet方法来筛选文件
//如果accpet方法返回的是true就把该文件添加到所需文件集合中
if (filter.accept(this, names[i])) {//filter.accept(this, names[i])这就是我们所说的接口回调
v.add(names[i]);
}
}
return v.toArray(new String[v.size()]);
}
*FilenameFilter的接口
public interface FilenameFilter {
boolean accept(File dir, String name);
}
*我使用list方法对我所要获取的目录下的文件进行筛选
File file=new File("aaaa");
if(file.isDirectory()) {
String[] name=file.list(new FilenameFilter() {//匿名内部类
//实现接口FilenameFilter的accept方法,对后缀为.txt的文件进行筛选
public boolean accept(File dir, String name) {
File cFile=new File(dir, name);
//如果文件名以.txt结尾则返回true,否则返回false
if(cFile.isFile()&&name.endsWith(".txt")) {
return true;
}
return false;
}
});
//输出.txt类型文件的文件名
for (String filename : name) {
System.out.println(filename);
}
2.接口回调的实现原理
3.接口回调的使用场景
1.一些框架中提供了监听功能(如果有什么变化,来通知我)
2.一些类中过滤方法(满足什么条件,做什么操作)
3.在Android中监听功能非常常见
4.个人见解
在使用接口回调的时候,我们实现接口的类的时候,一般不会再去创建一个类来实现该接口的方法的逻辑,一般都使用匿名内部类。
1.没必要为了一个方法去创建一个类,项目不好管理
2.使用内部匿名类会使代码更有可读性