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 メソッドにまとめられる。