web-dev-qa-db-ja.com

Javaのメソッドはネストできますか、そしてその効果は何ですか?

たとえば、これは合法です:

class NAME {
method {
     method {} 
}
} 

そしてその効果は何でしょうか?特別な構文は含まれていますか?

25
David

[〜#〜] update [〜#〜]Javaなので、ラムダを使用して8つのメソッドをネストできます。以下を参照してください- この他の質問

この回答は、Javaより前のバージョンJava 8に対して有効です。

元の答えは次のとおりです:

Javaのメソッドはネストできる[...]?

いいえ、それは不可能です。

あなたが得ることができる最も近いものは:

class Name {
    void methodOne() {
        class InnerClass {
           void methodTwo() {
           }
         }
     }
 }

つまり、メソッドで定義された内部クラスで定義された2番目のメソッドです。

内部クラス内でstaticメソッドを宣言できるため、newを呼び出す必要はありません。

43
OscarRyz

これは無効な構文です。そのような機能はサポートされていません。 (Java 7)と見なされていますが)

代わりに、ネストされたクラスを使用できます ちょうど尋ねられた

13
SLaks

番号。

1つの解決策は、呼び出すメソッドを「親」メソッドの外部のプライベートメソッドとして宣言することです。本当に気になる場合は、命名規則を使用して、「親」メソッドに「属している」ことを示すことができます。

考慮することができるもう1つのことは、プログラマーの間で広く知られていないようですが、任意のスコープブロックを宣言してラベルを付け、breakを使用してそのブロックから抜けることができます。

したがって、以下は完全に合法なJavaです。

void method() {
      myInnerMethod : {
        // do some stuff

        if (condition) {
            break myInnerMethod;
        }

        // do some more stuff
      }
}

もちろん、スコープブロックは実際にはメソッドではありませんが、場合によっては、「内部メソッド」を実行するために使用できます。

5
Neil Coffey

いいえ。これは無効な構文です。そしてそれは残念です-それは私がエイダから逃したものの一つです。ネストされたメソッドを定義する機能がないと、かなりの量のプライベートメソッドを持つクラスを編成するときに多くの問題が発生します。そこから、結束力のない土地への滑りやすい斜面になります。

ネストされたクラスを使用することもできますが、代償が伴います。ネストされた各クラスは、$ namedクラスを生成します。それぞれは、開いているファイルハンドル(アーカイブからプルされていない場合)と、そのクラス定義によって使用されるメモリの点で問題があります。一部のシステムでは、デプロイできるファイルの数(したがって生成されるクラスの合計)に上限があります(Google Appsなど)。

言い換えると、入れ子になったメソッドを模倣するために入れ子になったクラスを使用しません(それを試すことに決めた場合に備えて)。

(Adaのように)ネストされたメソッドを使用できると仮定すると、それらのメソッドは、囲んでいるメソッド内でのみ表示されます(通常のprivateメソッドよりも制限されます)。外側のスコープで定義されている変数とパラメーターを確認します(ただし、最終的に定義されている場合のみ)。

ネストされた名前空間でメソッドとアルゴリズムを整理できるようになります。入れ子になったメソッドをインテリジェントに使用すると、コードの編成に役立ちます。

3
luis.espinal

チェックしないと、現時点ではクラス内でメソッドを定義する必要があるため、これはコンパイラーによって受け入れられないと言います。ただし、メソッド内で内部クラスを定義することもできます(「ローカルおよび匿名の内部クラス」を参照)。

http://Java.Sun.com/docs/books/tutorial/Java/javaOO/innerclasses.html

2
James P.