2016-10-07 2 views
1

Из любопытства я как-то придумал два класса, где инициализация одного класса зависит от экземпляра другого класса, как показано:два класса, инициализация первого класса зависит от второго класса и наоборот

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; 
    } 
} 

Мне просто интересно, можно ли инициализировать экземпляр класса Один или класс два? Если это невозможно, кто-нибудь сталкивался с подобными ситуациями в своих проектах? Есть ли способ обхода этой проблемы взаимозависимости?

+0

вы можете инициализировать его сначала с помощью 'One()' constuctor, а затем передать его второму конструктору –

+0

i означает 'One one = new One();' и 'Two two = new Two();' after которые используют их для установки значений –

+1

, это не логично, я думаю, что вы можете изменить структуру кода, мы делаем это в базах данных, когда у нас есть такие петли, мы меняем архитектуру, чтобы удалить цикл, созданный отношениями –

ответ

5

На самом деле и можно просто создать экземпляр любой из них со ссылкой на другой класс является нулевым

Например, вы можете написать

One o = new One(null); 
Two t = new Two(o); 
o.t = t; // or use a setter 
+2

Я позволил добавить пример. –

+0

@PeterLawrey спасибо вам –

1

Создайте сеттер в каждом объекте для другого типа и удалите их из конструктора.

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

Потребности в циклическом нарушении только одна сторона для отказа от конструктора. –

+1

@MarkoTopolnik правильно, но я хотел показать самый верный способ сделать это. Разумеется, существует множество способов свести к минимуму этот тип создания зависимостей. – rorschach

+0

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

1

Если у вас есть два класса с зависимостью друг от друга простого решением является создавать как ссылки только в одном из них, как следующие:

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 
Смежные вопросы