Sto provando a fare un gioco tetris e sto ottenendo “Shape non è una class che racchiude” quando provo a creare un object
public class Test { public static void main(String[] args) { Shape s = new Shape.ZShape(); } }
Sto usando le classi interne per ogni forma. Ecco parte del mio codice
public class Shape { private String shape; private int[][] coords; private int[][] noShapeCoords = { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 } }; private int[][] zShapeCoords = { { 0, -1 }, { 0, 0 }, { -1, 0 }, { -1, 1 } }; private int[][] sShapeCoords = { { 0, -1 }, { 0, 0 }, { 1, 0 }, { 1, 1 } }; private int[][] lineShapeCoords = { { 0, -1 }, { 0, 0 }, { 0, 1 }, { 0, 2 } }; private int[][] tShapeCoords = { { -1, 0 }, { 0, 0 }, { 1, 0 }, { 0, 1 } }; private int[][] squareShapeCoords = { { 0, 0 }, { 1, 0 }, { 0, 1 }, { 1, 1 } }; private int[][] lShapeCoords = { { -1, -1 }, { 0, -1 }, { 0, 0 }, { 0, 1 } }; private int[][] mirroredLShapeCoords = { { 1, -1 }, { 0, -1 }, { 0, 0 }, { 0, 1 } }; public Shape(){ int[][] coords = noShapeCoords; shape = "NoShape"; } class ZShape { int[][] coords = zShapeCoords; String shape = "ZShape"; } class SShape { int[][] coords = sShapeCoords; String shape = "SShape"; } //etc }
Che cosa sto facendo di sbagliato ?
ZShape
non è statico quindi richiede un’istanza della class esterna.
La soluzione più semplice è rendere ZShape e qualsiasi class nidificata static
se ansible.
Potrei anche rendere qualsiasi campo final
o static final
che puoi anche tu.
Supponi RetailerProfileModel è la tua class principale e RetailerPaymentModel è una class interna al suo interno. Puoi creare un object della class Inner al di fuori della class come segue:
RetailerProfileModel.RetailerPaymentModel paymentModel = new RetailerProfileModel().new RetailerPaymentModel();
Quello che suggerirei non è convertire la class non statica in una class statica perché in tal caso, la class interna non può accedere ai membri non statici della class esterna.
Esempio :
class Outer { class Inner { //... } }
Quindi, in tal caso, puoi fare qualcosa come:
Outer o = new Outer(); Outer.Inner obj = o.new Inner();
Come affermato nei documenti :
OuterClass.InnerClass innerObject = outerObject.new InnerClass();
A volte, dobbiamo creare una nuova istanza di una class interna che non può essere statica perché dipende da alcune variabili globali della class genitore. In tale situazione, se si tenta di creare l’istanza di una class interna che non è statica, viene generato not an enclosing class
errore di not an enclosing class
.
Prendendo l’esempio della domanda, cosa ZShape
se ZShape
non può essere statico perché ha bisogno della variabile globale della class Shape
?
Come puoi creare una nuova istanza di ZShape
? Questo è come:
Aggiungi un getter alla class genitore:
public ZShape getNewZShape() { return new ZShape(); }
Accedilo in questo modo:
Shape ss = new Shape(); ZShape s = ss.getNewZShape();
Ho riscontrato lo stesso problema. Ho risolto creando un’istanza per ogni class pubblica interna. per quanto riguarda la tua situazione, ti suggerisco di usare ereditarietà diversa dalle classi interne.
public class Shape { private String shape; public ZShape zShpae; public SShape sShape; public Shape(){ int[][] coords = noShapeCoords; shape = "NoShape"; zShape = new ZShape(); sShape = new SShape(); } class ZShape{ int[][] coords = zShapeCoords; String shape = "ZShape"; } class SShape{ int[][] coords = sShapeCoords; String shape = "SShape"; } //etc }
allora puoi new Shape (); e visita ZShape attraverso shape.zShape;
Non è necessario rendere la class nidificata come statica, ma deve essere pubblica
public class Test { public static void main(String[] args) { Shape shape = new Shape(); Shape s = shape.new Shape.ZShape(); } }
Nel caso in cui la class Parent sia singleton, utilizzare la seguente modalità:
Parent.Child childObject = (Parent.getInstance()).new Child();
dove getInstance () restituirà l’object singleton della class genitore.
Una cosa che non ho capito all’inizio quando ho letto la risposta accettata è che rendere statica una class interiore è fondamentalmente la stessa cosa che spostarla nella sua class separata.
Quindi, quando si ottiene l’errore
xxx non è una class che racchiude
Puoi risolverlo in uno dei seguenti modi:
static
alla class interna o Shape shape = new Shape(); Shape.ZShape zshape = shape.new ZShape();