学以致用,从前看匿名类的时候老觉得好复杂,弄的这么麻烦干嘛。现在用的时候,回过头来看看,还好有这么个看似复杂的设计。
其实就是拿来做一个filenamefilter,File类有一个方法,能够枚举文件夹里面所有的某种类型的文件。但是没找到类似*.jpg之类的方法能够只列举jpg图片。剩下的几个方法,看来看去,好像只有list(FilenameFilter)这个比较合适。就随便查了下这个类,该天杀的居然是抽象类,实现抽象类神马的最讨厌了。
果不其然,这个需要一个子类实现,老子只是过滤下文件类型好不好,要不要在混乱不堪的文件夹里面再弄个类出来?这时候匿名类就派上用场了。轻轻松松三分钟,解决意外烦恼。完全不用费心费力去想这个类用英文应该起什么名,名字不重要,匿名的么。拿到File类的实例了,想怎么list就怎么list:
File picset = new File(picsetRoot); String[] files = picset.list( // Use anonymous class as a filter to get jpg, jpeg and webp files new FilenameFilter(){ public boolean accept(File f, String fname){ return fname.toLowerCase().endsWith(".jpg") || fname.toLowerCase().endsWith(".jpeg") || fname.toLowerCase().endsWith(".webp"); } });
只需要说我要new一个FilenameFilter类的子类实例,这个类什么样呢?自己看大括号里面吧。大括号里面就是实现FilenameFilter的accept方法了。拿到fname随随便便一返回。大功告成。我很怀疑当年java的攻城狮们设计filenamefilter的时候就考虑到了这样的用法。要不然随便一个ls *.jpg的功能还要新建文件弄个类?
读万卷书,抠万里腚。看似稀奇古怪的设计,都是有一些寓意的。设计语言的老伙伴们,还是比大多数用之抠腚的小伙伴们厉害好多滴。