Иногда это просто должен быть f.e. для почтового приложения, где можно только войти в систему с простым паролем а не с хешем. И если Ваше приложение не имеет проблем безопасности, оно не должно влиять на Вас.
Да, это возможно, если один из классов отвечает за создание экземпляра другого класса. Первый конструктор может передать свой экземпляр в качестве параметра для второго класса.
public class A {
final B b;
public A() {
b = new B(this);
}
public B getB() {
return b;
}
}
public class B {
final A a;
public B(A a) {
this.a = a;
}
}
Как указал другой плакат, можно сделать это, сделав один из классов ответственным за создание другого и передав себя в конструктор. для другого объекта.
Однако это создает потенциальные проблемы, если вы хотите, чтобы один экземпляр первого класса соответствовал одному экземпляру второго класса (что, похоже, вы делаете). Другой объект потенциально может передать существующую ссылку на первый класс в конструктор для второго класса, тем самым допуская недопустимую ситуацию (экземпляр второго класса теперь имеет ссылку на экземпляр первого класса, который ссылается на другой экземпляр второго класса).
Больше потенциальных проблем возникает, если учесть, что конструктор второго класса не может ссылаться на неинициализированные члены первого класса.
Мое предложение состоит в том, что если два класса настолько взаимосвязаны, что вы хотите, чтобы каждый из них имел окончательные ссылки на другие, просто сделайте их одного класса . Тогда у вас всегда будет последняя ссылка на другой объект: this
.
если вы используете контейнер Di, такой как guice, вы можете добиться этого без явной ссылки, передаваемой внутри конструктора, что может быть подвержено ошибкам, как указывалось ранее.
объявить зависимость ab и ba и ввести один из них в другой класс. guice сделает некоторую магию, чтобы оба поля были окончательными. в основном он сначала вводит один прокси, а позже устанавливает его делегатор.
Вам нужен образец кода для этого?