2012-02-16 17 views
2

私は以前の同僚が書いたJavaコードを学習していますが、私は正しく理解できないものを見つけました。 ここにgetGeneAvailableTaxonomies()メソッドがあります。このメソッドは、独自の宣言accept()を持つメソッド呼び出しを含んでいるようです。 それは本当ですか?それは可能ですか?Java、別のメソッドの中のメソッド宣言?

ここでコード部分です:FilenameFilter()から最後までプログラムの意味を理解できません。

public List<Integer> getGeneAvailableTaxonomies() { 
    List<Integer> availableTaxon = new ArrayList<Integer>(); 

    File dataDirectory = new File(_currentApplicationPath, String.format("Data")); 
    FilenameFilter filter = new FilenameFilter() { 
     public boolean accept(File dir, String name) { 
      return name.startsWith("gene_") && name.endsWith("_info.info"); //get all info files... 
     } 
    }; 
    String[] children = dataDirectory.list(filter); 

    for(String child:children) { 
     availableTaxon.add(Integer.parseInt(child.substring(child.indexOf("_")+1, child.lastIndexOf("_")))); 
    } 

    return availableTaxon; 
} 

答えて

8

accept()メソッドが定義されているコード部分は、匿名クラスと呼ばれています。

FilenameFilter filter = new FilenameFilter() { 
    public boolean accept(File dir, String name) { 
     return name.startsWith("gene_") && name.endsWith("_info.info"); //get all info files... 
    } 
}; 

何ここで起こっていることはFilenameFilter、新しいクラスの作成です。彼らはacceptメソッドを実装/オーバーライドしています。このように考えると、1つのステートメントで:

+0

Thanxたくさんあります。だから、あなたが書いたこの2番目の部分は、私のコードと同じ意味を持っていますよね? –

+0

それは同じことを達成するでしょう。 – csturtz

0

彼はdataDirectory内のファイルは、文字列の配列にか含めるべきかどうかを判断するために、独自のフィルタを作成しました。そのためには、FilenameFilterインターフェイスの独自のバージョンであるacceptメソッドを実装する必要がありました。その後、そのフィルターをdataDirectoryに適用しました。

インターフェイスを実装したクラスを作成できましたが、メソッドが1つしかないため、匿名クラスとして直接コードに実装する方が便利でした。

1

私は大学を持っていません。しかし、私はインターネットから学んだ。

これは、「メソッド内のメソッド」ではありません。それはインターフェイスを実装しています。

FilenameFilter

あなたはextending an abstract classを行うか、そのフィールド/変数に直接それを適用するインターフェイスを実装することができます。変数/フィールドはメソッド内で使用できるので、可能です。

編集

あなたはnew FilenameFilter() {...の最後の中括弧の後にセミコロンを気づくことができます。ブロック全体が式なので、フィールド/変数に適用することができます。

2

これは匿名の内部クラスです。つまり、独自の名前を持たず、インスタンスとともにアドホックとして定義されたクラスです。

実際には、このクラスの名前は、内部クラスの連続番号に従って、外部クラスの名前とそれに続く$と数字(1,2,3など)です。

0

これらは匿名クラスと呼ばれます。それらはJLSで説明されていますが、「Java in a Nutshell」や他のいくつかのチュートリアルでそれらについて読むことができます。

0

FilenameFilterはインターフェイスです。 new FilenameFilter(){...}という構文は、内部に実装されたFilenameFilterを実装する匿名クラスを作成し、インスタンス化します。 dataDirectory.list()の内容を確認するには、Fileを参照してください。 "指定されたフィルタを満たすこの抽象パス名で示されるディレクトリ内のファイルとディレクトリを指定する文字列の配列を返します。"

0

ここには何が起こっているのですか?この構文は匿名内部クラスと呼ばれます。 newFilenameFilterから継承する新しいクラスを作成していることを示しています。その理由はFilenameFilterタイプの参照に割り当てることができますが、そのクラスはFilenameFilteracceptメソッドをオーバーロードするacceptというメソッドを実装しています。そのクラスはプログラムの残りの部分に見える名前を持っていませんが(コンパイラの中には少なくともターゲットディレクトリにクラスファイルを作成するものもありますが)、filterがスコープ内にある限り、その唯一のインスタンスが存在します。

これは、Java 1.2についてJavaで登場したほぼlambdaのようなものです(私は思います)。

関連する問題