Próbuję stworzyć grę Tetris i pojawia się błąd kompilatora
Shape is not an enclosing class
kiedy próbuję stworzyć obiekt
public class Test {
public static void main(String[] args) {
Shape s = new Shapes.ZShape();
}
}
Używam klas wewnętrznych dla każdego kształtu. Oto część mojego kodu
public class Shapes {
class AShape {
}
class ZShape {
}
}
Co ja robię źle ?
java
inner-classes
V Sebi
źródło
źródło
new Shape().new ZShape();
. KlasaZShape
wymaga wystąpienia instancji obejmującej.AShape
iZShape
rozszerzenie klasy podstawowejShapes
. Zagnieżdżanie klas nie jest dobrym pomysłem na ten problem.Odpowiedzi:
ZShape
nie jest statyczny, więc wymaga wystąpienia klasy zewnętrznej.Najprostszym rozwiązaniem jest utworzenie ZShape i dowolnej klasy zagnieżdżonej,
static
jeśli możesz.Chciałbym również dokonywać żadnych pól
final
lubstatic final
że można również.źródło
ZShape
static
całkowicie celowość tego, co próbuje robić, co jest kopią instancjiZShape
.static
czyni to łatwiejszym, a nie trudniejszym.ZShape myShape = new Shape().instantiateZShape();
. Oznacza to, że ZShape, który otrzymujesz, nie istnieje bez Kształtu, co jest celem tutaj.Załóżmy, że RetailerProfileModel jest Twoją klasą główną, a RetailerPaymentModel to klasa wewnętrzna w tej klasie. Możesz utworzyć obiekt klasy wewnętrznej poza klasą w następujący sposób:
źródło
underTest = Mockito.mock(Outer.class).new InnerNonStaticClass();
Sugerowałbym, aby nie konwertować klasy niestatycznej na klasę statyczną, ponieważ w takim przypadku klasa wewnętrzna nie może uzyskać dostępu do elementów niestatycznych klasy zewnętrznej.
Przykład:
W takim przypadku możesz zrobić coś takiego:
źródło
Outer.Inner obj = new Outer().new Inner();
()
jest obowiązkowy. Jednak C, C ++ nie jest koniecznością. Oto przykład, który nie działa. Ponadto znalazłem ten post . co wyjaśnia więcej na temat gramatyki w Javie i tego, jak są one przetwarzane. Chciałbym zobaczyć przykładowy przypadek, gdy ta składnia działa dla Ciebie.Jak stwierdzono w dokumentach :
źródło
Czasami musimy utworzyć nową instancję klasy wewnętrznej, która nie może być statyczna, ponieważ zależy od niektórych zmiennych globalnych klasy nadrzędnej. W takiej sytuacji, jeśli spróbujesz utworzyć instancję klasy wewnętrznej, która nie jest statyczna, generowany
not an enclosing class
jest błąd.Biorąc przykład pytania, co jeśli
ZShape
nie może być statyczny, ponieważ potrzebuje globalnej zmiennejShape
klasy?Jak utworzyć nową instancję
ZShape
? Oto jak:Dodaj moduł pobierający w klasie nadrzędnej:
Uzyskaj dostęp w ten sposób:
źródło
źródło
Napotkałem ten sam problem. Rozwiązałem, tworząc instancję dla każdej wewnętrznej klasy publicznej. co do twojej sytuacji, sugeruję, abyś używał dziedziczenia innego niż klasy wewnętrzne.
wtedy możesz nowy Shape (); i odwiedź ZShape poprzez shape.zShape;
źródło
Nie trzeba ustawiać zagnieżdżonej klasy jako statyczną, ale musi ona być publiczna
źródło
Jedną z rzeczy, których na początku nie zdawałem sobie sprawy, gdy czytałem zaakceptowaną odpowiedź, było to, że utworzenie statycznej klasy wewnętrznej jest w zasadzie tym samym, co przeniesienie jej do osobnej klasy.
Tak więc, gdy pojawia się błąd
Możesz go rozwiązać na jeden z następujących sposobów:
static
słowo kluczowe do klasy wewnętrznej lubźródło
W przypadku, gdy klasa Parent jest singletona, użyj następującego sposobu:
gdzie
getInstance()
zwróci obiekt singletonu klasy nadrzędnej.źródło
Aby spełnić wymaganie zawarte w pytaniu, możemy umieścić klasy w interfejsie:
a następnie użyj jako autor próbował wcześniej:
Jeśli szukamy właściwego „logicznego” rozwiązania, należy zastosować
fabric
wzorzec projektowyźródło