Estoy tratando de hacer un juego de Tetris y obtengo el error del compilador
Shape is not an enclosing class
cuando trato de crear un objeto
public class Test {
public static void main(String[] args) {
Shape s = new Shapes.ZShape();
}
}
Estoy usando clases internas para cada forma. Aquí hay parte de mi código
public class Shapes {
class AShape {
}
class ZShape {
}
}
Qué estoy haciendo mal ?
java
inner-classes
V Sebi
fuente
fuente
new Shape().new ZShape();
. La claseZShape
necesita una instancia de cierre para ser instanciada.AShape
yZShape
extienda la clase baseShapes
. Anidar clases no es un buen diseño para este problema.Respuestas:
ZShape
no es estático, por lo que requiere una instancia de la clase externa.La solución más simple es hacer ZShape y cualquier clase anidada
static
si puede.También haría cualquier campo
final
ostatic final
que tú también puedas.fuente
ZShape
static
totalmente derrota el propósito de lo que está tratando de hacer, que es instanciar una copia deZShape
.static
hace más fácil, no más difícil.ZShape myShape = new Shape().instantiateZShape();
. Implica que el ZShape que obtienes no existe sin una Forma, que es la intención aquí.Suponga que RetailerProfileModel es su clase Main y RetailerPaymentModel es una clase interna dentro de ella. Puede crear un objeto de la clase interna fuera de la clase de la siguiente manera:
fuente
underTest = Mockito.mock(Outer.class).new InnerNonStaticClass();
Lo que sugeriría es no convertir la clase no estática en una clase estática porque en ese caso, su clase interna no puede acceder a los miembros no estáticos de la clase externa.
Ejemplo:
Entonces, en tal caso, puede hacer algo como:
fuente
Outer.Inner obj = new Outer().new Inner();
()
es obligatorio. Sin embargo, C, C ++ no es imprescindible. Aquí hay un ejemplo que no funciona. Además, encontré esta publicación . que explica más sobre la gramática en Java y cómo se analizan. Me encantaría ver un caso de muestra cuando esta sintaxis funcione para usted.Como se indica en los documentos :
fuente
A veces, necesitamos crear una nueva instancia de una clase interna que no pueda ser estática porque depende de algunas variables globales de la clase primaria. En esa situación, si intenta crear la instancia de una clase interna que no sea estática, se genera un
not an enclosing class
error.Tomando el ejemplo de la pregunta, ¿qué
ZShape
pasa si no puede ser estático porque necesita una variable global deShape
clase?¿Cómo puedes crear una nueva instancia de
ZShape
? Así es como:Agregue un captador en la clase padre:
Acceda así:
fuente
fuente
He encontrado el mismo problema. Lo resolví creando una instancia para cada clase pública interna. En cuanto a su situación, le sugiero que use una herencia distinta de las clases internas.
entonces puedes nueva Forma (); y visite ZShape a través de shape.zShape;
fuente
No es necesario que la clase anidada sea estática, pero debe ser pública
fuente
Una cosa que no me di cuenta al principio al leer la respuesta aceptada fue que hacer que una clase interna sea estática es básicamente lo mismo que moverla a su propia clase separada.
Por lo tanto, al obtener el error
Puede resolverlo de cualquiera de las siguientes maneras:
static
palabra clave a la clase interna, ofuente
En caso de que la clase Parent sea singleton, use la siguiente manera:
donde
getInstance()
devolverá el objeto singleton de la clase padre.fuente
Para lograr el requisito de la pregunta, podemos poner clases en la interfaz:
y luego usar como autor probado antes:
Si buscamos la solución "lógica" adecuada, se debe utilizar el
fabric
patrón de diseñofuente