java.io.FilenameFilterとjava.io.FileFilter

FilenameFilterとFileFilterの違いがよくわからないのでGroovyでスクリプトを作って動かしてみる。
違いはビミョー。File#getParentFile()を使えばどちらを使っても結局は同じことが出来る。FileFilterを使ったほうが融通が利くだろうと思う。

import java.io.File
import java.io.FileFilter
import java.io.FilenameFilter

dir = new File("directory")

println " ***** FilenameFilter *****"
dir.listFiles(new MyFilenameFilter())

println " ***** FileFilter *****"
dir.listFiles(new MyFileFilter())


class MyFilenameFilter implements FilenameFilter {
    
    boolean accept(File dir, String name) {
        println "${dir.name} ${name}"
        return true
    }  
}

class MyFileFilter implements FileFilter {
    
    boolean accept(File dir) {
        println "${dir.parentFile.name} ${dir.name}"
        return true
    }  
}

結果は同じにすることができる

 ***** FilenameFilter *****
directory dir1
directory dir2
directory dir3
directory file.txt
 ***** FileFilter *****
directory dir1
directory dir2
directory dir3
directory file.txt

Groovyについて気づいたことなど(両方ともどこかなんとなく知っていたことなのだけど、はまった。再確認。)

  • class定義を書く場合は、*を使ったimport文(import java.io.*など)ではだめ。1つずつ指定する必要あり。クラス定義をしない場合は*使った指定が出来る。
  • def run()を定義するとエラーになる。run()はコンパイル時に別の処理をするものとして生成されるらし。このことがここからわかる

ルーズ・メソッド[*4]は該当するスクリプトファイルに対応するクラスの static メソッドとしてコンパイルされる。たとえば、foo という名前のルーズ・メソッドが、Bar.groovy という名前のスクリプトファイルにあれば、Bar クラスの static メソッド foo としてコンパイルされる。ルーズ・ステートメントは、自動生成される main メソッドから呼び出される run メソッドにまとめられる。