Однако оба объекта требуют друг друга для функционирования, и если я создаю новый экземпляр одного из объектов до того, как другой будет создан, локальной переменной в «верхних» классах присваивается значение null.
Я думаю, что ответ, который вы ищете, - это «шаблон синглтона». Здесь вы создаете только один экземпляр класса для использования в других местах. Вот хорошая ссылка для чтения . Вот страница википедии с некоторыми примерами Java.
Итак, ваш код будет выглядеть примерно так:
public class A {
private final static A instance = new A();
/* private constructor forces you to use the getInstance() method below */
private A() {}
public static A getInstance() {
return instance;
}
}
Тогда, где бы вы ни хотели получить экземпляр A, вы должны сделать что-то вроде:
public class B {
private final A classA = ClassA.getInstance();
...
}
Нет причины, по которой A
не мог бы также иметь экземпляр B
и вызывать методы B
в своих собственных методах. Что вы не можете сделать с этой перекрестной зависимостью, так это вызвать любой другой метод в конструкторе.
В общем, кстати, эти шаблоны следует использовать с осторожностью. Лучший способ добиться этого - внедрение зависимостей вместо глобальных ссылок. Поперечная инъекция возможна, но опять же, она должна использоваться экономно. Лучшим решением было бы реорганизовать классы, чтобы они имели линейные зависимости.
Есть ли в Java какие-либо концепции, которые ссылались бы на фактический объект (например, указатель) на объект как на переменную, а не делали копию объекта?
Java передается по значению, но значение любого объекта является ссылкой на объект (аналогично указателям в C, хотя они не адрес памяти). Таким образом, если у вас есть экземпляр A
и вы присвоите его другому полю, это поле будет иметь то же значение и будет ссылаться на тот же экземпляр A
.
// instantiate a new instance of A
A a1 = new A();
// assign the reference to A to another variable
a2 = a1;
// they are equivalent and both reference the same object
if (a1 == a2) ...