2011-08-02 15 views
1

私は匿名のクラスに関して引数を理解しようとしています。私が見た本の中の例は、議論をしていないか、あるいはそれをよく説明していない。ここでは、コード(一言で言えば第2版の例5-8に、Javaからとはい私はそれが古いことを知っている: - )です...匿名クラスJavaの質問

import java.io.*; 

//Print out all the *.java files in the directory. 
public static void main(String[] args) 
{ 
    File f = new File(args[0]); 
    String[] list = f.list(new FilenameFilter() { 
    public boolean accept(File f, String s) { 
     return s.endsWith(".java"); 
    } 
    }); 
    for (int i = 0; i < list.length; i++) 
    System.out.println(list[i]); 
    } 
} 

私の質問には、ファイル名のfは「ファイルF」の引数に適用されます方法です「受け入れる」と「String s」の引数はどこから来たのでしょうか?おそらく、 'accept'メソッドが呼び出されます。FilenameFilterコンストラクタからのものでしょうか?
ありがとうございます!

答えて

3

あなたはJava APIのソースファイルに見てみるならば、あなたはFile.javaに次見つける:

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++) { 
       if (filter.accept(this, names[i])) { 
        v.add(names[i]); 
       } 
      } 
      return v.toArray(new String[v.size()]); 
     } 

指定したファイル名フィルタのacceptメソッドを呼び出します。文字列はあなたの例にありますnames[i]list()は、ファイルパス名で示されるディレクトリ内のファイルとディレクトリを指定する文字列の配列を返します。

あなたのコードを説明します

String[] list = f.list(new FilenameFilter() { 
    public boolean accept(File f, String s) { 
     return s.endsWith(".java"); 
    } 
    }); 

は、Fileクラスのlistメソッドを呼び出します(上記参照)を受け入れるメソッドの実装とFilenameFilterインターフェイスの新しい匿名クラスで。

+0

'under the hood'コードを記載してくれてありがとうございます。 –

1

残念なことに偶然です。 2つのfはお互いに関係ありません。acceptへのパラメータは、メソッドのローカル変数とは独立していて、何の関係もありません。

コードが混乱しています。それは、これを次のようになります。

File f = new File(args[0]); 
String[] list = f.list(new FilenameFilter() { 
    public boolean accept(File file, String s) { 
     return s.endsWith(".java"); 
    } 
}); 

FilenameFilteraccept方法はFile.listメソッド内から呼び出されました。

+0

私は当初2つのfで混乱していましたが、それを超えました。私が見逃していた部分は、「フードの下に」コードでした。ありがとう! –

1

両方のパラメータは、FilenameFilter匿名クラスのインスタンスでaccept()を呼び出したときに、listメソッドによって渡されます。

生の流れ:

  1. あなたはflist()を呼び出します。
  2. リスト()各ファイルは、2つのパラメータファイル(ファイルF)と、その名前(文字列の)かどうかを決定accept()
  3. あなたの実装とそのacceptメソッドを呼び出すことにより、指定されたフィルタ(あなたの匿名クラス)を満たしているかどうかをチェックしこのファイルを受け入れるかどうかを決定する必要があります。
+0

生の流れが助けになりました! –

1

ここでトリッキーなことは、あなたがFilenameFilterが、その後f.list(FilenameFilter filenameFilter)に渡される特定accept方法とを作成することです。

f.listのコードは、現在のファイル(File f)とその名前(String s)でFilenameFilterのacceptメソッドを呼び出して、現在の候補が結果に含まれるべきかどうかを判断する方法を知っています。

File f = new File(args[0])は、accept(...)File f引数とは無関係です。彼らはちょうどあなたのコードで同じ名前を持っています。

つまり、acceptをオーバーライドした独自のワンショットFilenameFilterサブクラスを作成し、それを使用します。 acceptメソッドは、提供する方法を知っている2つの引数をとります。File.list()

1

FilenameFilterはインターフェイスです。 new FileNameFilter()を実行すると、このインターフェイスの新しい実装が作成されます。

コード内でインラインではなく通常のクラスとして作成できました。

1

listメソッドFileは、ディレクトリで見つかったファイルごとにFilenameFilterオブジェクトのacceptメソッドを呼び出します。