2009-07-26 14 views

Respuesta

5

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.

+13

Ese ejemplo es una clase interna anónima. – starblue

+2

RESPUESTA TOTALMENTE incorrecta –

+0

@Greg Hewgill: ¿Puedes reemplazar el ejemplo de la clase interna anónima con una clase local? Miré el código varias veces para descubrir que no fue lo que me preguntaron :) – realPK

1

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.

3

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.

2

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.

12

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.

0

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.

0

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
Cuestiones relacionadas