J'essaie de créer un jeu Tetris et j'obtiens l'erreur du compilateur
Shape is not an enclosing class
quand j'essaye de créer un objet
public class Test {
public static void main(String[] args) {
Shape s = new Shapes.ZShape();
}
}
J'utilise des classes internes pour chaque forme. Voici une partie de mon code
public class Shapes {
class AShape {
}
class ZShape {
}
}
Qu'est-ce que je fais mal ?
java
inner-classes
V Sebi
la source
la source
new Shape().new ZShape();
. La classe aZShape
besoin d'une instance englobante pour être instanciée.AShape
etZShape
étendre la classe de baseShapes
. L'imbrication des classes n'est pas une très bonne conception pour ce problème.Réponses:
ZShape
n'est pas statique, il nécessite donc une instance de la classe externe.La solution la plus simple consiste à créer ZShape et toute classe imbriquée
static
si vous le pouvez.Je ferais aussi des champs
final
oustatic final
que vous pouvez aussi.la source
ZShape
static
défait totalement le but de ce qu'il essaie de faire, qui est d'instancier une copie deZShape
.static
rend plus facile, pas plus difficile.ZShape myShape = new Shape().instantiateZShape();
. Cela implique que la forme Z que vous obtenez n'existe pas sans forme, ce qui est l'intention ici.Supposons que RetailerProfileModel est votre classe principale et RetailerPaymentModel est une classe interne à l'intérieur. Vous pouvez créer un objet de la classe Inner en dehors de la classe comme suit:
la source
underTest = Mockito.mock(Outer.class).new InnerNonStaticClass();
Ce que je suggérerais n'est pas de convertir la classe non statique en une classe statique car dans ce cas, votre classe interne ne peut pas accéder aux membres non statiques de la classe externe.
Exemple :
Donc, dans ce cas, vous pouvez faire quelque chose comme:
la source
Outer.Inner obj = new Outer().new Inner();
()
est obligatoire. Cependant, C, C ++ ce n'est pas un must. Voici un exemple qui ne fonctionne pas. De plus, j'ai trouvé ce post . qui explique plus sur la grammaire en Java et comment ils sont analysés. J'aimerais voir un exemple de cas où cette syntaxe fonctionnera pour vous.Comme indiqué dans les documents :
la source
Parfois, nous devons créer une nouvelle instance d'une classe interne qui ne peut pas être statique car elle dépend de certaines variables globales de la classe parente. Dans cette situation, si vous essayez de créer l'instance d'une classe interne qui n'est pas statique, une
not an enclosing class
erreur est levée.En prenant l'exemple de la question, que faire si elle
ZShape
ne peut pas être statique car elle a besoin d'une variable globale deShape
classe?Comment pouvez-vous créer une nouvelle instance de
ZShape
? C'est ainsi:Ajoutez un getter dans la classe parent:
Accédez-y comme ceci:
la source
la source
J'ai rencontré le même problème. J'ai résolu en créant une instance pour chaque classe publique interne. Quant à votre situation, je vous suggère d'utiliser un héritage autre que les classes internes.
alors vous pouvez nouveau Shape (); et visitez ZShape à travers shape.zShape;
la source
Pas besoin de rendre la classe imbriquée statique mais elle doit être publique
la source
Une chose que je n'avais pas réalisé au début en lisant la réponse acceptée était que rendre une classe interne statique est fondamentalement la même chose que la déplacer vers sa propre classe séparée.
Ainsi, lors de l'obtention de l'erreur
Vous pouvez le résoudre de l'une des manières suivantes:
static
mot clé à la classe interne, oula source
Dans le cas où la classe Parent est singleton, utilisez la méthode suivante:
où
getInstance()
renverra l'objet singleton de la classe parent.la source
Pour atteindre l'exigence de la question, nous pouvons mettre les classes en interface:
puis utiliser comme auteur essayé auparavant:
Si nous recherchons la solution "logique" appropriée, il faut utiliser le
fabric
modèle de conceptionla source