Welchen Vorteil haben lokale Klassen in Java oder in einer anderen Sprache, die diese Funktion nutzt?Vorteil der lokalen Klassen Java
Antwort
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.
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.
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.
# 2 und # 3 sind die einzigen Gründe, warum ich sie jemals persönlich benutzt habe. –
(wenn es nicht dasselbe wie # 1 ist) Da sie Namen haben, können Sie sie wiederholt verwenden. Plus, Punkt 3 ist gut. –
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
@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. –