2015-11-14 9 views
1

У меня есть два объекта.Объекты Java содержат друг друга

Child.java

public class Child { 
    Parents parents; 
} 

Parents.java

public class Parents { 
    ArrayList<Child> children = new ArrayList<Child>(); 
} 

Я хочу, чтобы они имели друг с другом. Например:

Foo.java

public class Foo { 
    public static void main(String[] args) { 
     Child child1 = new Child(); 
     Child child2 = new Child(); 
     ArrayList<Child> children_list= new ArrayList<Child>(); 
     children_list.add(child1).add(child2); 
     Parents parents = new Parents(); 

     for (Child child : children_list) { 
      // ... 
      // Bind them together 
      // ... 
     } 
     child1.parents.equals(parents); // true 
     child2.parents.equals(parents); // true 
     // And parents.children is a list containing child1 and child2 
    } 
} 

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

parents.children.add(child); 
child.parents = parents; 
parents.children.set(parents.children.size() - 1, child); 

Это заставит child2.parent.children не иметь child1.

ответ

2

Вы работаете с объектами, поэтому ваши переменные на самом деле являются ссылками. Когда вы назначаете «родители» в качестве родителя child1, вы сохраняете ссылку, а не значение, и наоборот. Поэтому, если вы создадите «родители», родитель «child1» и «child2» оба будут ссылаться на один и тот же объект. И если вы добавите обратные ссылки, оба дочерних объекта будут «видеть» изменения, потому что вы ссылаетесь на одни и те же объекты в памяти. Я поняла? Прошу прощения!

EDIT

// ... 
// Bind them together 
// ... 

станет

parents.children.add(child); 
child.parents = parents; 

и он будет делать то, что вы ожидаете.

Окончательная рекомендация. Используйте child1.parents == parents вместо child1.parents.equals(parents), потому что вы готовы к compare instances of objects (на самом деле он будет иметь тот же результат, потому что вы не переопределили метод equals).

+0

Извините, я не совсем понимаю, что вы пытаетесь сказать. Может быть, есть код? Или, другими словами, вы имеете в виду, что мне просто нужно добавить ссылки соответственно на «child1» и «child2»? –

Смежные вопросы