Non è una class che racchiude Java

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:

  • Aggiungi la parola chiave static alla class interna o
  • Spostalo nella sua class separata.
 Shape shape = new Shape(); Shape.ZShape zshape = shape.new ZShape();