два класса, инициализация первого класса зависит от второго класса и наоборот

#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