2009-01-26 25 views

Respuesta

10

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.

+2

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

+7

@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. –

24

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.

12

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.

+0

# 2 y # 3 son las únicas razones por las que los he usado personalmente. –

+0

(si no es lo mismo que # 1) Como tienen nombres, puede usarlos repetidamente. Además, el punto 3 es bueno. –

Cuestiones relacionadas