Нелегальная прямая ссылка, проблемы видимости объекта будут компилироваться - PullRequest
0 голосов
/ 23 сентября 2010

Спасибо, что нашли время, чтобы прочитать.=)

Проблема, с которой я сталкиваюсь, заключается в видимости объектов.Я создаю объекты и пытаюсь создать ссылки на них до того, как они будут инициализированы или содержат какие-либо данные.Вы можете понять, что я пытаюсь сделать, с помощью предоставленного кода.

Некоторые квадраты могут видеть другие квадраты и т. Д. Теперь мой код компилируется!Проблема в том, что у меня есть методы getter, которые возвращают null из этих объектов.Я попытался поместить все инициализации в объявление класса Square, однако именно здесь я получаю «Ссылку на незаконную пересылку».

Итак, наконец, в конце блока кода вы заметили, как я пытаюсь получить доступ к этим объектам иих ссылки.Все четыре возвращают ноль, для чего я собираюсь указать, что существует ссылка.

Я немного понимаю, что здесь не так, возможно, мой подход к объектам неверен?Я думаю, что мои любительские навыки в основном то, что удерживает меня от этого =)

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 ]

1 голос
/ 23 сентября 2010

Просто используйте сеттеры вместо попыток сделать это в конструкторе, поскольку это просто невозможно.

square1 = new Square();
square2 = new Square();
square3 = new Square();

square1.setNorth(square2);
square1.setSouth(square3);
...
1 голос
/ 23 сентября 2010

Учитывая, что им нужно знать друг о друге, почему бы сначала не создать все квадраты, а затем создать метод 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);

Это лучше, если вы можете избежать круговых ссылок, но иногда это просто способ вещей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...