2009-01-26 6 views

Antwort

10

Sie ermöglichen es Ihnen, Logik aus der übergeordneten Klasse zu nehmen und sie zu objektivieren. Dies entfernt die Funktionalität von der Stelle, an die sie nicht gehört, und fügt sie in ihre eigene Klasse ein. Was aber, wenn dieses neue Objekt nur für kurze Zeit nur für die Dauer eines einzelnen Codeblocks benötigt wird? Nun, da passt eine lokale Klasse.

+2

Es ist nicht so sehr die Dauer der Objektinstanz, sondern ihr Umfang. Wenn die Klasse nur für die übergeordnete Klasse sichtbar sein muss, verhindert ihre lokale Verwendung, dass sie an anderer Stelle verwendet wird. Außerdem kann die lokale Klasse private Mitglieder des übergeordneten Elements sehen - eine nicht-lokale Klasse kann dies nicht tun. – belugabob

+7

@belugabob: 1. Lokale Klassen können nur innerhalb der Methode oder des Konstruktors verwendet werden, in dem sie definiert sind. Sie sind für die umschließende Klasse nicht einmal sichtbar. 2. Verschachtelte/innere Klassen können auch private Variablen der einschließenden Klasse sehen. –

24

Hier ist ein Beispiel, wie eine anonyme innere Klasse, eine lokale innere Klasse und eine reguläre innere Klasse in einem Programm vorhanden sein können. Das Beispiel betrachtet ein myMethod-Verfahren und eine InnerClass-Klasse, die in der MyClass-Klasse vorhanden ist. Aus Gründen der Diskussion werden die Klassen alle Runnable Schnittstelle implementieren:

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() {} 
    } 
} 

Die anonyme innere Klasse verwendet werden kann, einfach, um eine Klasse zu machen, die Runnable, ohne tatsächlich zu schreiben, die Klasse implementiert und Naming es, und als krosenvold in seinem Beitrag erwähnt, wird es als "armer Mann der Schließung" in Java verwendet.

Zum Beispiel kann eine sehr einfache Art und Weise ein Thread mit Hilfe einer anonyme innere Klasse zu beginnen wäre:

new Thread(new Runnable() { 
    public void run() 
    { 
     // do stuff 
    } 
}).start(); 

Ein lokale innere Klasse kann verwendet werden, um eine Klasse zu machen, die in dem lokalen Bereich ist - Es kann nicht von anderen Methoden außerhalb von myMethod zugegriffen werden.

Wenn es eine andere Methode ist, und wir haben versucht, eine Instanz der LocalClass zu machen, die im Innern der myMethod Methode befinden, werden wir nicht in der Lage sein, dies zu tun:

public void anotherMethod() 
{ 
    // LocalClass is out of scope, so it won't be found, 
    // therefore can't instantiate. 
    new Thread(new LocalClass()).start(); 
} 

Eine innere Klasse ist Teil der Klasse, in der sich die innere Klasse befindet. So kann z. B. auf die innere Klasse InnerClass von anderen Klassen aus zugegriffen werden MyClass.InnerClass. Natürlich bedeutet dies auch, dass eine andere Methode in MyClass eine innere Klasse instanziieren kann.

public void anotherMethod() 
{ 
    // InnerClass is part of this MyClass. Perfectly instantiable. 
    new Thread(new InnerClass()).start(); 
} 

Eine andere Sache, über die anonyme innere Klasse und lokale innere Klasse ist, dass es in der Lage sein wird, final Variablen zuzugreifen, die in der myMethod deklariert sind:

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 
     } 
    } 

    // ... // 

Also, was sind die Vorteile? Die Verwendung anonymer innerer Klassen und lokaler innerer Klassen anstelle einer separaten vollständigen inneren Klasse oder Klasse ermöglicht ersteren Zugriff auf final Variablen in der Methode, in der sie deklariert sind, und gleichzeitig sind die Klassen lokal für die Methode selbst, so dass von externen Klassen und anderen Methoden innerhalb derselben Klasse nicht darauf zugegriffen werden kann.

12

Es gibt eine Reihe von Dingen, die Sie mit lokalen Klassen tun können, die Sie nicht mit anonymen inneren Klassen bekommen.

  • , da der Typ einen Namen hat, können Sie sinnvoller Mitglieder nicht in dem Supertyp
  • ein Vornamens
  • Subtyp mehr als eine Basis machen Stapel Spuren leichter zu verfolgen (insbesondere für Sperrobjekte) hinzufügen Typ
  • Konstrukt in mehr als einem Ort, und mehrere Konstruktoren

auf der anderen Seite sie einige hideously ausführliche Syntax selbst messier machen.

+0

# 2 und # 3 sind die einzigen Gründe, warum ich sie jemals persönlich benutzt habe. –

+0

(wenn es nicht dasselbe wie # 1 ist) Da sie Namen haben, können Sie sie wiederholt verwenden. Plus, Punkt 3 ist gut. –