2010-04-14 23 views
19

por ejemplo, y es esto legal:¿Se pueden anidar los métodos en Java y cuál es el efecto?

class NAME { 
method { 
    method {} 
} 
} 

y cuál sería el efecto? ¿Hay alguna sintaxis especialmente involucrada?

+2

cosas no válido! Estoy arriesgando votos negativos: ¿qué estás buscando? solo SO votos? ¿De qué se trata esta pregunta? ¿Qué estás intentando lograr? –

+4

@EJP, el compilador solo me dará la respuesta correcta si la respuesta de los compiladores es sí. Podría intentarlo y no podría funcionar, pero la sintaxis podría ser incorrecta, podría estar en un error. thered no será forma de saberlo. – David

+3

Lo siento, pero esa es una objeción sin sentido. Usted preguntó si es legal. El compilador responde eso en negativo o afirmativo. – EJP

Respuesta

38

ACTUALIZACIÓN Desde Java 8 métodos se pueden anidar usando lambdas, ver this other question.

Esta respuesta es válido para las versiones de Java antes de Java 8

Respuesta original sigue:

Puede métodos en Java pueden anidar [...]?

No, eso no es posible.

Lo más cercano que puede obtener es:

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

Es decir, un segundo método definido en una clase interna definida en un método.

Se puede declarar el método estático dentro de la clase interna, por lo que no tiene que llamar a new

+0

Debe eliminar el paréntesis en la declaración de la clase interna: 'clase InnerClass {' – Mindwin

+2

Sí, esto es antiguo y cerrado, pero por el bien de los lectores, no puede declarar miembros estáticos en una clase interna porque necesitan una instancia del clase exterior No puedes evitar el nuevo operador. – 1der

+0

Java 8 proporciona una buena sintaxis de azúcar para esto. http://stackoverflow.com/a/28576581/354144 –

12

Es una sintaxis no válida; ninguna de esas características es compatible. (Aunque se está considerando para Java 7)

En su lugar, puede usar clases anidadas, que usted just asked about.

+0

Clases internas específicamente locales. –

+0

Java 7 ya está disponible y no incluye métodos anidados. Tal vez Java 8. – mirelon

+0

Java 8 ya está fuera y no incluye métodos anidados. Tal vez Java 9. – Oli

4

Una solución es simplemente para declarar los métodos que desea enviar, como los métodos privados fuera de la "matriz" method-- si estuviera realmente molesta, se puede usar alguna convención de nomenclatura para indicar que "pertenecen" al método "principal".

Otra cosa que podría considerar, y no parece ser ampliamente conocida entre los programadores, es que puede declarar cualquier bloque de alcance arbitrario y etiquetarlo, luego utilizar el break para salir de ese bloque.

Así que la siguiente es perfectamente legal de Java:

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

     if (condition) { 
      break myInnerMethod; 
     } 

     // do some more stuff 
     } 
} 

Por supuesto, el bloque de alcance no es realmente un método, pero en algunos casos, se puede utilizar para hacer lo que uno quiere un "interno método para.

+0

+1, nunca lo supe, pero acabo de verificarlo ...Supongo que no puedes llamar al bloque, pero como se señaló anteriormente, puedes saltar a él. (En realidad no estoy seguro de cuáles son los usos de esta función, TBH). – Edmund

+0

@ Edmund no puedes ** saltar a ** bloques etiquetados. Solo puedes ** salir de ** ellos. Lo que los convierte en inútiles como métodos alternativos. –

+0

@Stephen - gracias por la corrección. Nunca usé roturas etiquetadas y asumí que significaban "romper con esta etiqueta" y no "salir de esta etiqueta". – Edmund

-2

No se acepta en Java. Parece que quiere hacer una recursión, simplemente llame al mismo método nuevamente.

method(){ 

    method(); 

} 
+0

Creo que significan literalmente definir un método dentro de otro, no recursividad. –

+1

@Neil: No creo que él sepa a qué se refiere. ;) Sin embargo, probablemente tengas razón. – SLaks

3

Nº Es la sintaxis no válida. Y es una pena, es una de las cosas que extraño de Ada. No tener la capacidad de definir métodos anidados crea muchos problemas al organizar clases con cantidades sustanciales de métodos privados. A partir de ahí, hay una pendiente resbaladiza hacia la tierra sin cohesión.

Puede usar clases anidadas, pero tienen un precio. Cada clase anidada genera una clase $ named. Cada uno tiene un peaje en términos de manejadores de archivos abiertos (si no se extrae de un archivo) y memoria tomada por su definición de clase. Algunos sistemas tienen un límite en la cantidad de archivos (por lo tanto, clases generadas totales) que pueden implementar (Google Apps, por ejemplo).

En otras palabras, no usaría clases anidadas para imitar métodos anidados (en caso de que decide intentar eso.)

Ahora, suponiendo que se pudiese utilizar métodos anidados (como en Ada), esos métodos sólo serían visibles dentro del método de cerramiento (que serían más restringido que típicos métodos privados.) Podrían ver variables y parámetros definidos en el ámbito externo (pero probablemente solo si se define como final.)

Le permitiría organizar su m métodos y algoritmos en espacios de nombres anidados. Cuando se usan de forma inteligente, los métodos anidados realmente ayudan a organizar su código.

Cuestiones relacionadas