Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hallo Leute, habe gelesen dass lokale Klassen ein anderer Begriff für innere Klassen sind!
Habe das hier dazu gefunden:
Lokale Klassen sind auch innere Klassen, die jedoch nicht als Eigenschaft direkt in einer Klasse eingesetzt werden. Diese Form der inneren Klasse befindet sich in Anweisungsblöcken von Methoden oder Initialisierungsblöcken. Lokale Schnittstellen sind nicht möglich...
Kann mir es bitte einer mit anderen Worten erklären
Java:
public class DrinnenMachtSpass
{
public static void main( String[] args )
{
int i = 2;
final int j = 3;
class In
{
In() {
System.out.println( j );
// System.out.println( i ); // Fehler, da i nicht final
}
}
new In();
}
}
Ich habe es noch nie benutzt, aber der einzige Nutzen, den ich erkennen kann ist die Möglichkeit Konstruktoren zu nutzen, welche man bei anonymen Klassen nicht hat.
Ein Beispiel könnte sein, wenn man irgendwelche Objekte kurz zusammenfassen will, z.B um einen Array von ints zu sortieren, aber danach noch die "permutation" für den Originalarray zu erhalten - dann könnte man sowas machen wie
Code:
class IntPair implements Comparable...
{
int a, b;
}
@patrick81
Das erste Beispiel ist eine normale anonyme Inner Class. Die ist sehr häufig.
Sie durch eine lokale Klasse zu ersetzen wie im zweiten Beispiel ist überflüssig.
Ich habe es noch nie benutzt, aber der einzige Nutzen, den ich erkennen kann ist die Möglichkeit Konstruktoren zu nutzen, welche man bei anonymen Klassen nicht hat.
Ja, @tfa, sowas ähnliches wollte ich auch @patrick81 schreiben... habe dann aber überlegt, wie man die beiden Fälle voneinander abgrenzen kann. Man könnte GROB sagen, dass man eine Lokale Klasse braucht, wenn man mehrere Instanzen einer Klasse braucht, die anonym sein könnte, wenn ... man nicht mehrere Instanzen brauchen würde ... :roll: (mehr Koffein... )
@patrick81
Das erste Beispiel ist eine normale anonyme Inner Class. Die ist sehr häufig.
Sie durch eine lokale Klasse zu ersetzen wie im zweiten Beispiel ist überflüssig.
Ein weiteres Beispiel:
Enums haben wir hier einige lokale - in der Regel beschreiben die den Status eines Objektes und sind public. Es kann schon hinterfragt werden ob eine innere Klasse richtig ist, aber einerseits reduziert es die Anzahl Files und, IMHO wesentlich wichtiger, es signalisiert die Zusammengehörigkeit.
@Andi_CH: Ich glaube du verwechselst hier nested-class mit locale-class. Eine Nested-Class oder static-nested-class ist ganz nett (wird ja auch sehr gerne von Google eingesetzt ). Aber eine lokale klasse, ja ich wusste das es sie gibt. Aber verwendet habe ich sie noch nie. Sehe jetzt keinen Vorteil zur anonymen inneren Klasse.
Man könnte GROB sagen, dass man eine Lokale Klasse braucht, wenn man mehrere Instanzen einer Klasse braucht, die anonym sein könnte, wenn ... man nicht mehrere Instanzen brauchen würde
Ja, das wäre der einzige Vorteil.
Vielleicht für Testdaten in einem Unit-Test, wenn man viele Objekte einer Klasse haben möchte. (Man könnte natürlich auch eine normale Nested Class nehmen.)
Wo braucht man da denn eine lokale Klasse? Ich benötige nur eine Instanz der anonymen Klasse - oder habe ich den Sinn der Aussage "mehrere" falsch verstanden?
Java:
public void foo() {
final Runnable runnable = new Runnable() {
public void run() {
}
}
}
Ein weiterer Vorteil von lokalen gegenüber anonymen Klassen ist, dass lokale Klassen mehrere Interfaces implementieren können.
Java:
public void foo(){
class Irgendwas implements Comparable<Irgendwas>, Runnable{
...
}
List<Irgendwas> list = new ArrayList<Irgendwas>();
list.add( new Irgendwas( 123 ));
}
P.S. Das letzte mal, dass ich eine lokale Klasse benutzte war ein kleiner, unbedeutender Algorithmus bei dem Objekte auf mehrere Listen und Maps verteilt werden mussten.
Da sieht man, dass an Schulen doch nicht immer alles richtig doziert wird ;-)
Klassen in Klassen drin wurden uns als lokal verkauft und die hier als lokal bezeichneten wurden uns verschwiegen - zugegebenermassen sehe ich allerdings dafür auch keine weitverbreitete Anwendung, denn ...
public class Readable
{
public static void main(String[] args)
{
Readable readable=new Readable();
Readable.Writable writAble=readable.new Writable(); // <-- ist ein wenig ungewohnt zu lesen
writAble.setName("Peter");
System.out.println(readable.getName());
}
private String name;
public String getName() {
return name;
}
public class Writable
{
public void setName(String name)
{
Readable.this.name=name;
}
}
}
wobei man hier aufpassen muss, dass man wirklich eine nested und keine static-nested verwendet. Letzteres kann gehandhabt werden, wie eine normale top-level-class.