¿Cuál es la ventaja de las clases locales en Java o en cualquier otro idioma que haga uso de esta característica?Ventaja de las clases locales Java
Respuesta
Le permiten sacar la lógica de la clase principal y objetivarla. Esto elimina la funcionalidad de donde no pertenece y la coloca en su propia clase. Pero, ¿qué pasa si este nuevo objeto solo es necesario por un corto tiempo, solo por la duración de un solo bloque de código? Bueno, ahí es donde encaja una clase local.
Aquí hay un ejemplo de cómo una clase interna anónima, una clase interna local y una clase interna normal pueden estar presentes en un programa. El ejemplo está mirando un método myMethod
y una clase InnerClass
presente en la clase MyClass
. Por el bien de la discusión, las clases de todo estarán implementando la interfaz Runnable
:
public class MyClass
{
public void myMethod()
{
// Anonymous inner class
Runnable r = new Runnable() {
public void run() {}
};
// Local inner class
class LocalClass implements Runnable
{
public void run() {}
}
}
// ... //
// Inner class
class InnerClass implements Runnable
{
public void run() {}
}
}
El anónima clase interna se puede utilizar para hacer simplemente una clase que implementa Runnable
sin tener que escribir la clase y nombrarlo, y como krosenvold mencionado en su publicación, se utiliza como un "cierre de pobres" en Java.
Por ejemplo, una manera muy sencilla para iniciar una Thread
usando una clase interna anónima sería:
new Thread(new Runnable() {
public void run()
{
// do stuff
}
}).start();
Un clase interna local de puede ser utilizado para hacer una clase que se encuentra dentro del ámbito local - no podrá accederse desde otros métodos fuera de myMethod
.
Si había otro método y tratamos de hacer que una instancia de la LocalClass
que se encuentra dentro del método myMethod
, no vamos a ser capaces de hacerlo:
public void anotherMethod()
{
// LocalClass is out of scope, so it won't be found,
// therefore can't instantiate.
new Thread(new LocalClass()).start();
}
Un clase interna es parte de la clase en la que se encuentra la clase interna. Así, por ejemplo, se puede acceder a la clase interna InnerClass
desde otras clases al MyClass.InnerClass
. Por supuesto, también significa que otro método en MyClass
también puede instanciar una clase interna.
public void anotherMethod()
{
// InnerClass is part of this MyClass. Perfectly instantiable.
new Thread(new InnerClass()).start();
}
Otra cosa acerca de la clase interna anónima y clase interna local, es que va a ser capaz de acceder final
variables que se declaran en el myMethod
:
public void myMethod()
{
// Variable to access from anonymous and local inner classes.
final int myNumber = 42;
// Anonymous inner class
Runnable r = new Runnable() {
public void run()
{
System.out.println(myNumber); // Works
}
};
// Local inner class
class LocalClass implements Runnable
{
public void run()
{
System.out.println(myNumber); // Works
}
}
// ... //
Así que, ¿cuáles son las ventajas? El uso de clases internas anónimas y clases internas locales en lugar de tener una clase interna o clase completamente desarrollada permitirá que las primeras tengan acceso a las variables final
en el método en el que se declaran, y al mismo tiempo, las clases son locales para el método en sí, por lo que no se puede acceder desde clases externas y otros métodos dentro de la misma clase.
Hay una serie de cosas que puede hacer con las clases locales que no obtiene con clases internas anónimas.
- porque el tipo tiene un nombre, se puede añadir más útilmente miembros no en el supertipo
- un nombre dado puede hacer pila traza más fácil de seguir (en particular para los objetos de bloqueo) subtipo
- más de una base escriba
- construcción en más de un lugar, y varios constructores
por otro lado hacen algún terriblemente detallado sintaxis incluso más desordenado.
# 2 y # 3 son las únicas razones por las que los he usado personalmente. –
(si no es lo mismo que # 1) Como tienen nombres, puede usarlos repetidamente. Además, el punto 3 es bueno. –
- 1. Java/Android: clases locales anónimas vs clases nombradas
- 2. Java ¿cómo imprimir todas las variables locales?
- 3. ¿Cuáles son las diferencias fundamentales entre Java y C# en términos de clases internas/locales/anónimas?
- 4. Ventaja de la jerarquía de clases con raíz única
- 5. Variables locales en java
- 6. Las variables locales en el código de bytes de Java
- 7. ¿Cómo proteger las clases compiladas de Java?
- 8. ¿Las clases de Java son objetos?
- 9. ¿Dónde se almacenan las variables locales finales de Java?
- 10. ¿Cuál es la ventaja de la interfaz sobre las clases abstractas?
- 11. ¿Las clases Java más interesantes/útiles?
- 12. ¿Cómo instrumentar las clases del sistema Java?
- 13. Java: variables finales en las clases abstractas
- 14. ¿Cómo se definen las variables estáticas locales locales de subprocesos?
- 15. Por qué usar el método de clases internas abstractas locales
- 16. Clases anidadas locales de Java y acceso a los súper métodos
- 17. acceso todas las variables locales
- 18. Cómo leer las cookies locales
- 19. Cuál es la ventaja de las excepciones encadenadas
- 20. Ventaja de constructores genéricos
- 21. ¿Las clases internas de Java representan un riesgo de seguridad?
- 22. ¿Las clases de envoltura de Java son realmente inmutables?
- 23. Código SQL dentro de las clases de Java
- 24. Clickatell de SOAP WSDL para las clases de Java JAXB
- 25. tamaño de las clases de Java en el espacio PermGen
- 26. Deshabilitar las conexiones JMX locales en JVM
- 27. ¿Es más rápido acceder a las variables locales finales que las variables de clase en Java?
- 28. clases parciales de Java
- 29. ¿Dónde se almacenan las clases de Java en Oracle?
- 30. ¿Las clases de ByteBuffer/IntBuffer/ShortBuffer Java son rápidas?
No es tanto la duración de la instancia del objeto, sino su alcance. Si la clase solo tiene que estar visible para la clase principal, al hacerlo local evitará que se use en otro lugar. Además, la clase local puede ver a los miembros privados del padre: una clase no local no puede hacer esto. – belugabob
@belugabob: 1. Las clases locales solo se pueden usar dentro del método o constructor en el que están definidas. Ni siquiera son visibles para la clase adjunta. 2. Las clases anidadas/internas también pueden ver las variables privadas de la clase adjunta. –