代码之家  ›  专栏  ›  技术社区  ›  Bryan Harrington

非法的前向引用,将导致对象可见性问题

  •  0
  • Bryan Harrington  · 技术社区  · 16 年前

    谢谢你花时间阅读。=)

    某些方块可以看到其他方块等,现在我的代码编译!问题是我有从这些对象返回null的getter方法。我尝试将所有的初始化放在Square类声明中,但是这就是我得到“非法的前向引用”的地方。

    最后,在代码块的末尾,您注意到我是如何尝试访问这些对象及其引用的。所有四个都返回null,我要的是某个引用存在的迹象。

    我确实稍微理解这里出了什么问题,也许我处理对象的方法不正确?我认为我的业余技能主要是阻碍我在这一点=)

    class Puzzle extends JFrame
    {
    
         Square square1;
         Square square2;
         Square square3;
         Square square4;
         Square square5;
         Square square6;
         Square square7;
         Square square8;
         Square square9;
         Square square10;
         Square square11;
         Square square12;
         Square square13;
         Square square14;
         Square square15;
         Square square16;
    
        public Puzzle()
        {
    
            PuzzleListener plist = new PuzzleListener();
            JPanel puzzle_board = new JPanel(new GridLayout(4,4,5,5));
    
            //randomize the text index's and the starting black square.
    
            //            Square(north, south, east,west,isblack,text)
            square1 = new Square(null,square2,square5,null,false,"1");
            square2 = new Square(null,square3,square6,square1,false,"2");
            square3 = new Square(null,square4,square7,square2,false,"3");
            square4 = new Square(null,null,square8,square3,false,"4");
            square5 = new Square(square1,square6,square9,null,false,"5");
            square6 = new Square(square2,square7,square10,square5,false,"6");
            square7 = new Square(square3,square8,square11,square6,false,"7");
            square8 = new Square(square4,null,square12,square7,false,"8");
            square9 = new Square(square5,square10,square13,null,false,"9");
            square10 = new Square(square6,square11,square14,square9,false,"10");
            square11 = new Square(square7,square12,square15,square10,false,"11");
            square12 = new Square(square8,null,square16,square11,false,"12");
            square13= new Square(square9,square14,null,null,false,"13");
            square14 = new Square(square10,square15,null,square10,false,"14");
            square15 = new Square(square11,square16,null,square14,false,"15");
            square16 = new Square(square12,null,null,square15,false,"16");
    
    }
    
    
    
    class Square extends JPanel
    {
    
        //visible lable
        JLabel lblText;
    
        //internal object ID
        int id;
    
        //Define the visible neighbors
        Square north;
        Square south;
        Square east;
        Square west;
    
        //is the square black
        boolean isBlack;
    
        public Square(String text)
        {
    
            lblText = new JLabel(text);
            //setLayout(new GridLayout(5,5));
            lblText.setLocation(10,10000);
            add(lblText);
        }
    
        public Square(Square n,Square e,Square s,Square w,boolean black, String text)
        {
    
            north = n;
            east = e;
            south = s;
            west = w;
    
            isBlack = black;
    
            lblText = new JLabel(text);
            //setLayout(new GridLayout(5,5));
            lblText.setLocation(10,10000);
            add(lblText);
    
        }//end square
    
        Square getNorthNeighbor()
        {
            return north;
        }
        Square getSouthNeighbor()
        {
            return south;
        }
        Square getEastNeighbor()
        {
            return east;
        }
        Square getWestNeighbor()
        {
            return west;
        }
        boolean getIsBlack()
        {
            return isBlack;
        }
    
    
    }
    
    
    System.out.println("Panel 1 has been clicked and has the neighbors " + "North: " + square1.getNorthNeighbor() + "East: " + square1.getEastNeighbor() + "South: " + square1.getSouthNeighbor() + "West: " + square1.getWestNeighbor());
    
    2 回复  |  直到 15 年前
        1
  •  1
  •   Jon Skeet    16 年前

    既然他们需要互相了解,为什么不先创建所有的正方形,然后再创建一个正方形呢 setNeighbours(Square north, Square south, ...) 在实际创建所有对象时可以调用的方法?它在不变性方面并不好(对于一个类型来说通常是一个很好的属性),但从根本上说,您有循环引用。

    换一种说法,想象一下你必须创造两个 Person 并向每个人表明他们是兄弟。你不能这样做:

    Person billy;
    Person bobby;
    billy = new Person(bobby);
    bobby = new Person(billy);
    

    但你呢 可以

    Person billy = new Person();
    Person bobby = new Person();
    billy.setBrother(bobby);
    bobby.setBrother(billy);
    

        2
  •  1
  •   willcodejavaforfood    16 年前

    只需使用setters,而不是试图在构造函数中进行设置,因为这根本不可能。

    square1 = new Square();
    square2 = new Square();
    square3 = new Square();
    
    square1.setNorth(square2);
    square1.setSouth(square3);
    ...
    
    推荐文章