Ich versuche ein Tetris-Spiel zu erstellen und erhalte den Compilerfehler
Shape is not an enclosing class
wenn ich versuche ein Objekt zu erstellen
public class Test {
public static void main(String[] args) {
Shape s = new Shapes.ZShape();
}
}
Ich benutze innere Klassen für jede Form. Hier ist ein Teil meines Codes
public class Shapes {
class AShape {
}
class ZShape {
}
}
Was mache ich falsch ?
java
inner-classes
V Sebi
quelle
quelle
new Shape().new ZShape();
. Die KlasseZShape
benötigt eine umschließende Instanz, die instanziiert werden muss.AShape
undZShape
die Basisklasse zu erweiternShapes
. Das Verschachteln von Klassen ist kein wirklich gutes Design für dieses Problem.Antworten:
ZShape
ist nicht statisch und erfordert daher eine Instanz der äußeren Klasse.Die einfachste Lösung besteht darin, ZShape und jede verschachtelte Klasse zu erstellen,
static
wenn Sie können.Ich würde auch irgendwelche Felder machen
final
oderstatic final
das kannst du auch.quelle
ZShape
static
völlige Besiegen des Zwecks dessen, was er zu tun versucht, ist das Instanziieren einer Kopie vonZShape
.static
macht es einfacher, nicht schwerer.ZShape myShape = new Shape().instantiateZShape();
. Dies impliziert, dass die ZShape, die Sie erhalten, ohne eine Form nicht existiert, was hier beabsichtigt ist.Angenommen, RetailerProfileModel ist Ihre Hauptklasse und RetailerPaymentModel ist eine innere Klasse darin. Sie können ein Objekt der inneren Klasse außerhalb der Klasse wie folgt erstellen:
quelle
underTest = Mockito.mock(Outer.class).new InnerNonStaticClass();
Ich würde vorschlagen, die nicht statische Klasse nicht in eine statische Klasse zu konvertieren, da in diesem Fall Ihre innere Klasse nicht auf die nicht statischen Mitglieder der äußeren Klasse zugreifen kann.
Beispiel:
In einem solchen Fall können Sie also Folgendes tun:
quelle
Outer.Inner obj = new Outer().new Inner();
()
obligatorisch sind. C, C ++ ist jedoch kein Muss. Hier ist ein Beispiel, das nicht funktioniert. Außerdem habe ich diesen Beitrag gefunden . Hier erfahren Sie mehr über die Grammatik in Java und wie sie analysiert werden. Ich würde gerne einen Beispielfall sehen, wenn diese Syntax für Sie funktioniert.Wie in den Dokumenten angegeben :
quelle
Manchmal müssen wir eine neue Instanz einer inneren Klasse erstellen, die nicht statisch sein kann, da sie von einigen globalen Variablen der übergeordneten Klasse abhängt. Wenn Sie in dieser Situation versuchen, die Instanz einer inneren Klasse zu erstellen, die nicht statisch ist, wird ein
not an enclosing class
Fehler ausgegeben.Nehmen wir am Beispiel der Frage, was ist, wenn
ZShape
es nicht statisch sein kann, weil es eine globale Variable von benötigtShape
Klassenvariable benötigt wird?Wie können Sie eine neue Instanz von erstellen?
ZShape
? Das ist wie:Fügen Sie der übergeordneten Klasse einen Getter hinzu:
Greifen Sie wie folgt darauf zu:
quelle
quelle
Ich bin auf das gleiche Problem gestoßen. Ich habe gelöst, indem ich eine Instanz für jede innere öffentliche Klasse erstellt habe. In Bezug auf Ihre Situation schlage ich vor, dass Sie eine andere Vererbung als innere Klassen verwenden.
dann kannst du neue Form (); und besuchen Sie ZShape über shape.zShape;
quelle
Die verschachtelte Klasse muss nicht statisch sein, sondern muss öffentlich sein
quelle
Eine Sache, die ich beim Lesen der akzeptierten Antwort zunächst nicht erkannte, war, dass es im Grunde dasselbe ist, eine innere Klasse statisch zu machen, als sie in eine eigene Klasse zu verschieben.
Also, wenn der Fehler auftritt
Sie können es auf eine der folgenden Arten lösen:
static
Schlüsselwort zur inneren Klasse hinzu, oderquelle
Wenn die übergeordnete Klasse Singleton ist, gehen Sie wie folgt vor:
Dabei
getInstance()
wird das Singleton-Objekt der übergeordneten Klasse zurückgegeben.quelle
Um die Anforderung aus der Frage zu erfüllen, können wir Klassen in die Schnittstelle einfügen:
und dann als zuvor versuchter Autor verwenden:
Wenn wir nach der richtigen "logischen" Lösung suchen, sollte ein
fabric
Entwurfsmuster verwendet werdenquelle