¿Por qué los diseñadores de Java lo consideran útil/necesario?¿De qué sirve una clase interna de método local?
Respuesta
Utilización de clases de método local puede aumentar la legibilidad del código, manteniendo las piezas relacionadas entre sí. Como ejemplo artificioso, suponga que tiene un método que necesita para crear un hilo para hacer algo en el fondo:
class Test {
void f() {
// lots of stuff
new Thread(new Runnable() {
public void run() {
doSomethingBackgroundish();
}
}).start();
// lots more stuff
}
}
Sin clases de método local, que tendría que o bien:
- crear una nueva clase con nombre dentro de
Test
para hacer el procesamiento en segundo plano, o - crear una nueva clase con nombre en un archivo fuente separado para hacer el procesamiento en segundo plano.
Ambas opciones pueden reducir la legibilidad del código moviendo el procesamiento relacionado a otro lugar en el árbol fuente (tal vez en el mismo archivo fuente, tal vez en otro archivo fuente). El uso de una clase local de método mantiene la lógica de procesamiento justo donde se usa.
Esto ciertamente no es aplicable a todas las situaciones, pero puede ser muy útil en un número de situaciones comunes. Dicho código se usa comúnmente para los oyentes de acción GUI, que son clases muy pequeñas que generalmente solo transmiten llamadas de métodos de acción de un lugar a otro.
Asumo que quiere decir una clase interna anónima? Básicamente es un cierre. Puede volver a pasar el método y conserva el alcance de las variables donde se definió. Es útil para cosas como los oyentes de IU en Swing.
clases internas locales (distintos de las clases internas anónimas) son solamente de vez en cuando útil, aunque no tengo ninguna estadística para usted. Probablemente la gran mayoría de los programadores de Java no saben que existen, por lo que no están a punto de comenzar a usarlos.
¿Por qué? Bueno, es bueno tener un trampolín entre una clase interna anónima y una clase interna estándar. De la forma en que las cosas han funcionado, no esperaría que estuvieran en el JLS si ahora solo estuviera siendo estandarizado. En el momento de la actualización, había relativamente poca experiencia con las nuevas características, aunque el nuevo modelo de eventos AWT estaba íntimamente vinculado.
La mayoría de los usos son para almacenar alguna variable resultado para devoluciones de llamadas síncronas. Sin embargo, normalmente solo tendrías un valor devuelto a través del método al que se pasó la instancia, o usar algo como un futuro. Además, algunas veces quiere construir la clase en más de un punto dentro del método, pero no quiere perder las características de cierre.
Se le permite tener un constructor (o varios) y la posibilidad de llamar a nuevos métodos de la clase y aún así acceder a las variables finales declarados dentro del método que contiene.
¿Vale la pena la sobrecarga? Tal vez no en retrospectiva, pero creo que en ese momento no era del todo obvio que las limitaciones detrás de las clases internas anónimas (sin constructores específicos, y sin capacidad para llamar a nuevos métodos fuera de la clase) eran algo que simplemente podía dejarse sin una alternativa.
Dado que la mayoría de la gente probablemente nunca han visto una clase interna método local, aquí es un ejemplo:
public class TestMethodLocalInnerClass
{
public static void main(String[] args)
{
class Greeter implements Runnable
{
private final String _greeted;
public Greeter(String greeted)
{
super();
_greeted = greeted;
}
public void run()
{
System.out.printf("Hello %s!\n", _greeted);
}
}
new Greeter("world").run();
new Greeter("dog").run();
}
}
Esta teoría podría ser útil como un nivel adicional de encapsulación por debajo de una clase interna cuando una clase anónima puede No se usará porque necesita más de una instancia. Tal vez si necesita decir comparadores diferentes en diferentes métodos y necesita instanciarlos más de una vez. Esto parece ser muy, muy raro (nunca antes escribí tal clase), y no es gran cosa usar clases internas normales en su lugar.
Por lo tanto, en mi opinión, no valdría la pena incluirlo en un lenguaje de nuevo diseño.
respuesta a esta pregunta es una pregunta:
¿Cómo va a definir una clase de tal manera que, se va a usar esa clase con en una sola función? Ejemplo: la clase A tiene 2 funciones fun1 y fun2. ¿Cómo se define una clase para que solo sea utilizada por fun2?
Si define esa clase fuera de los métodos, entonces cada método comenzará a usarlo. ¿Cómo se segrega para usarlo solo en una función? Esto se puede hacer haciendo que esa clase sea una clase interna local para esa función. Puede asumirlo como una variable local de una función, que no puede ser utilizada por otras funciones. Este concepto también se denomina mayor nivel de seguridad o encapsulación.
Puede ser útil para encapsulación/alcance. P.ej. el resto del código no está contaminado con una definición de clase cuya funcionalidad provista es relevante solo dentro de ese método.
Estos son básicamente los mismos beneficios proporcionados por clases internas anónimas, pero hay algunas ventajas sobre una clase interna anónima:
- varias instancias pueden ser creados dentro del método
- pueden extender una clase y poner en práctica una o más interfaces
- pueden tener un constructor
- 1. Método La clase interna local solo puede acceder a la variable local final.¿Por qué?
- 2. Método principal en una clase interna estática.
- 3. Java: clase interna anónima usando una variable local
- 4. Instantiating una clase interna
- 5. ¿De qué sirve escribir una clase dentro de una interfaz?
- 6. ¿Propósito de una clase interna?
- 7. Método estático que devuelve la clase interna
- 8. ¿Puede un método en una clase interna acceder a un método de clase padre?
- 9. probando una clase interna
- 10. Creando una instancia de la clase interna
- 11. ¿Para qué sirve la clase A [_]?
- 12. clase Anotar con clase interna
- 13. android- calling Intención de una clase interna
- 14. Una clase interna retorcida en Java
- 15. ¿Para qué sirve crear una clase dentro de la interfaz e interfaz dentro de la clase
- 16. método "sortedArrayHint" de clase NSArray, ¿para qué sirve y cómo se usa?
- 17. ¿Qué es una clase interna sellada en C#?
- 18. ¿Por qué una clase interna serializable no es serializable?
- 19. ¿Por qué DialogFragment no puede ser una clase interna?
- 20. BroadcastReceiver como clase interna
- 21. ¿La clase local, la clase interna y la clase anidada son las mismas cosas en C++?
- 22. ¿Para qué sirve la invocación de un método virtual Java?
- 23. ¿Qué es una var no local de método en Scala?
- 24. ¿De qué sirve Control.Category?
- 25. Referencia de clase para una clase interna Java
- 26. ¿Para qué sirve Enum?
- 27. La subclasificación clase interna de la clase externa versus otra clase interna
- 28. Serialización de clase interna estática
- 29. ¿Para qué sirve UnmanagedMemoryStream?
- 30. ¿Puede una clase interna de una clase de plantilla ser una clase sin plantilla?
Ambas respuestas asumen que significaba clases anónimas, pero no es de hecho algo que se llama una clase local. ¿Es esto por lo que preguntas? –