Могут ли два объекта содержать друг друга в Java? - PullRequest
3 голосов
/ 21 февраля 2012

Вот ситуация. Допустим, у нас есть два отдельных типа объектов, и мы хотим, чтобы каждый из них указывал на другой. Например:

public class Object1
{
    Object2 obj2;

    public Object1(Object2 obj)
    {
        obj2 = obj;
    }
}

public class Object2
{
    Object1 obj1;

    public Object2()
    {
        obj1 = null;
    }

    public void setObject1(Object1 obj)
    {
        this.obj1 = obj;
    }
}

public class Tester
{
    public static void main(String[] args)
    {
        Object2 obj2 = new Object2();
        Object1 obj1 = new Object1(obj2);
        obj2.setObject1(obj1);
    }
}

Это разрешено в Java? Есть ли проблемы с выполнением чего-либо подобного?

Ответы [ 4 ]

7 голосов
/ 21 февраля 2012

Да, это разрешено в Java.Компилятор отслеживает зависимости способом, немного отличающимся от компиляторов C / C ++, поэтому, когда он обнаруживает, что вы скомпилировали Object1, которому нужно использовать некомпилированную версию Object2, он также скомпилирует Object2.

.значение «содержит» в этом контексте, чтобы быть технически правильным, ни один объект не содержит другой, они оба содержат ссылки на другой.Тем не менее, нет никаких ограничений на объекты, содержащие ссылки (независимо от того, насколько они круглые).

Интересно отметить, что сборщик мусора также прекрасно работает с циклическими ссылками, поэтому, если создается автономный круг ссылок на объекты, онибудет собирать мусор примерно в одно и то же время.Старые методы сборки мусора, которые работают через подсчет ссылок, могут быть обмануты циклическими ссылками, но Java использует алгоритм достижимости, который определяет, достижимы ли объекты из основного потока (ов) программы.

3 голосов
/ 21 февраля 2012

Нет проблем. Циклы разрешены. Вы должны были просто скомпилировать и проверить, а не задавать вопрос; -).

1 голос
/ 21 февраля 2012

Да, в Java разрешены циклические зависимости, и это правильный способ их обработки.

0 голосов
/ 21 февраля 2012

Как сказали Джеймс и Пангея, вы можете многому научиться, просто попробовав что-то для себя. Например, что, по вашему мнению, происходит в этой интересной ситуации?

class Class1 {
    public static final String name = Class2.name;
}

class Class2 {
    public static final String name = Class1.name;
}

class CircularTest {

    public static void main(String[] args) {
        System.out.println(Class1.name);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...