Java: Возможный иметь взаимные, заключительные ссылки класса?

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

7
задан DivideByHero 21 August 2009 в 03:56
поделиться

3 ответа

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

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;
    }
}
6
ответ дан 6 December 2019 в 19:40
поделиться

Как указал другой плакат, можно сделать это, сделав один из классов ответственным за создание другого и передав себя в конструктор. для другого объекта.

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

Больше потенциальных проблем возникает, если учесть, что конструктор второго класса не может ссылаться на неинициализированные члены первого класса.

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

6
ответ дан 6 December 2019 в 19:40
поделиться

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

объявить зависимость ab и ba и ввести один из них в другой класс. guice сделает некоторую магию, чтобы оба поля были окончательными. в основном он сначала вводит один прокси, а позже устанавливает его делегатор.

Вам нужен образец кода для этого?

1
ответ дан 6 December 2019 в 19:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: