#java
#java
Вопрос:
из любопытства я как-то придумал два класса, где инициализация одного класса зависит от экземпляра другого класса, как показано:
public class MyClass {
public static void main(String[] args) {
//How to initialize an instance of class One or class Two
}
}
class One{
Two t;
One(Two t){
this.t = t;
}
}
class Two{
One o;
Two(One o){
this.o = o;
}
}
Мне просто интересно, можно ли инициализировать экземпляр класса Один или класс два? Если это невозможно, кто-нибудь когда-либо сталкивался с подобными ситуациями в своих проектах? Есть ли способ обойти эту проблему взаимозависимости?
Комментарии:
1. вы можете сначала инициализировать его с
One()
помощью конструктора, а затем передать его во второй конструктор2. я имею
One one = new One();
в виду, иTwo two = new Two();
после этого используйте их для установки значений3. это не логично, я думаю, вы можете изменить структуру кода, мы делаем это в базах данных, когда у нас есть подобные циклы, мы меняем архитектуру, чтобы удалить цикл, созданный отношениями
Ответ №1:
На самом деле вы можете просто создать экземпляр любого из них со ссылкой на другой класс null
Например, вы можете написать
One o = new One(null);
Two t = new Two(o);
o.t = t; // or use a setter
Комментарии:
1. Я взял на себя смелость добавить пример.
Ответ №2:
Создайте сеттер в каждом объекте для другого типа и удалите их из конструктора.
public class One {
private Two two;
public void setTwo(Two two) {
this.two = two;
}
}
И
public class Two {
private One one;
public void setOne(One one) {
this.one = one;
}
}
Теперь
public static void main(String[] args) {
One one = new One();
Two two = new Two();
one.setTwo(two);
two.setOne(one);
}
Это самый простой способ, но лучше задать вопрос: зачем именно вам это нужно?
Комментарии:
1. Для прерывания цикла требуется только одна сторона, чтобы отказаться от внедрения конструктора.
2. @MarkoTopolnik правильно, но я хотел показать наиболее подробный способ сделать это. Конечно, существует множество различных способов минимизировать этот тип создания экземпляра зависимости.
3. Это то, что только что пришло мне в голову, я не уверен, зачем и когда это нужно, но просто любопытно, что делать, когда это действительно происходит в реальной жизни
Ответ №3:
Если у вас есть два класса с зависимостью друг от друга, простым решением является создание обеих ссылок только в одном из них следующим образом:
public class A {
private B b;
public A(B b) {
this.b = b;
b.setA(this);
}
...
}
public class B {
private A a;
public B() {
}
public void setA(A a) {
this.a = a;
}
...
}
И вы можете создать их следующим образом:
B b = new B(); // Here a doesn't yet exists so is correct
// that a is not referenced from b
A a = new A(b); // The constructor of A create both references
// from a to b and from b to a
// Here a references b and viceversa