Java 如何实例化一个调用自身另一个实例化的类?

Java 如何实例化一个调用自身另一个实例化的类?,java,instantiation,Java,Instantiation,我正在尝试编写一个rubiks立方体,我希望立方体的每个面都有六个面类。在这个类中,为了正确移动立方体,我需要访问立方体四面的面,所以我尝试在面的构造函数中包含四个其他面对象。我想知道这个实例化是否有效。我是这样做的(第一块代码在主类中,第二块来自Face类): white=新面孔(红色、蓝色、绿色、橙色、彩色、白色); 黄色=新面孔(橙色、蓝色、绿色、红色、彩色、黄色); 红色=新面孔(黄色、蓝色、绿色、白色、彩色、红色); 橙色=新面孔(白色、蓝色、绿色、黄色、颜色为橙色); 蓝色=新面孔(

我正在尝试编写一个rubiks立方体,我希望立方体的每个面都有六个面类。在这个类中,为了正确移动立方体,我需要访问立方体四面的面,所以我尝试在面的构造函数中包含四个其他面对象。我想知道这个实例化是否有效。我是这样做的(第一块代码在主类中,第二块来自Face类):

white=新面孔(红色、蓝色、绿色、橙色、彩色、白色);
黄色=新面孔(橙色、蓝色、绿色、红色、彩色、黄色);
红色=新面孔(黄色、蓝色、绿色、白色、彩色、红色);
橙色=新面孔(白色、蓝色、绿色、黄色、颜色为橙色);
蓝色=新面孔(红色、黄色、白色、橙色、彩色、蓝色);
绿色=新面孔(红色、白色、黄色、橙色、颜色。绿色);
前=黄色;
公共面顶部、左侧、右侧、底部;
公共小区[][]个小区;
公共面(t面、l面、r面、b面、c色){
top=t;
左=l;
右=r;
底部=b;
单元格=新单元格[3][3];
对于(int行=0;行<3;行++){
for(int col=0;col<3;col++){
单元格[行][col]=新单元格(c);
}
}
}

此示例不起作用,因为在实例化对象之前无法引用它们,除非它们已声明为具有某种状态

这就是说,如果你有另一个对象,比如说块,它包含4个面对象,这将解决你的问题。一张脸可以由颜色组成,而块可以管理所有逻辑

枚举面{
白色(颜色,白色),
红色(颜色,红色),
蓝色(颜色,蓝色)
//其他要素
//建造师
//吸气剂
}
类块{
//班级成员
//细胞
公共块(面顶、面左、面右、面底){
//分配
}
}

您可以在没有相邻面的情况下先初始化
面。然后,在初始化所有设置之后,通过setter定义它们之间的关系

class Face {
  Face white = new Face(Color.WHITE);
  Face yellow = new Face(Color.YELLOW);

  {
    white.setRight(yellow);
    yellow.setLeft(white);
  }


  public Face top, left, right, bottom;
  public Cell[][] cells;

  public Face(Color c) {
    // only cells init
  }

  public void setLeft(Face left) {
    this.left = left;
  }

  public void setRight(Face right) {
    this.right = right;
  }

}

我通常做的是添加一个初始化函数,该函数在实例化所有对象后使用,并将需要其他实例的代码移到那里。这样,在调用代码时,您已经有了有效的引用:

    // Instantiate the objects:
    white = new Face(Color.WHITE);
    yellow = new Face(Color.YELLOW);
    red = new Face(Color.RED);
    orange = new Face(Color.ORANGE);
    blue = new Face(Color.BLUE);
    green = new Face(Color.GREEN);
    // Initialize the objects:
    white.intitializeFace(red, blue, green, orange);
    yellow.intitializeFace(orange, blue, green, red);
    red.intitializeFace(yellow, blue, green, white);
    orange.intitializeFace(white, blue, green, yellow);
    blue.intitializeFace(red, yellow, white, orange);
    green.intitializeFace(red, white, yellow, orange);

    front = yellow;

公众面孔(c色){
单元格=新单元格[3][3];
对于(int行=0;行<3;行++){
for(int col=0;col<3;col++){
单元格[行][col]=新单元格(c);
}
}
}
公共无效初始化面(t面、l面、r面、b面){
top=t;
左=l;
右=r;
底部=b;
}
    // Instantiate the objects:
    white = new Face(Color.WHITE);
    yellow = new Face(Color.YELLOW);
    red = new Face(Color.RED);
    orange = new Face(Color.ORANGE);
    blue = new Face(Color.BLUE);
    green = new Face(Color.GREEN);
    // Initialize the objects:
    white.intitializeFace(red, blue, green, orange);
    yellow.intitializeFace(orange, blue, green, red);
    red.intitializeFace(yellow, blue, green, white);
    orange.intitializeFace(white, blue, green, yellow);
    blue.intitializeFace(red, yellow, white, orange);
    green.intitializeFace(red, white, yellow, orange);

    front = yellow;

    public Face(Color c) {
        cells = new Cell[3][3];
        for(int row = 0; row < 3; row++) {
            for(int col = 0; col < 3; col++) {
                cells[row][col] = new Cell(c);
            }
        }
    }
    public void intitializeFace(Face t, Face l, Face r, Face b) {
        top = t;
        left = l;
        right = r;
        bottom = b;
    }