2015-07-29 3 views
0

У меня есть класс, который объявлен как.Способы найти, где объект содержится в Java?

public class StatusMessage { 

    private Status status; 
    private String message; 
    private Throwable throwable; 
    private List<StatusMessage> children; 

    getters ; setters; 
} 

Это позволяет мне иметь бесконечную древовидную структуру StatusMessages путем добавления детей.

Образец кода для добавления ребенка.

StatusMessage parent =new StatusMessage(status,message); 
parent.getChildren().add(new StatusMessage(status,message)); 
parent.getChildren().add(new StatusMessage(status,message)); 
parent.getChildren().add(new StatusMessage(status,message)); 
StatusMessage child1 =new StatusMessage(status,message); 
parent.getChildren().add(child1); 
StatusMessage child1_1 =new StatusMessage(status,message); 
child1.getChildren().add(child1_1); 
.... 

Есть ли способ, я смогу узнать, что child1 является родителем child1_1 так же путешествовать с самого низкого уровня к корню?

Я хочу достичь этого, не добавляя ссылку на родителя в дочернем элементе. Есть ли способ сделать это на Java? Какие-либо предложения?

+3

К сожалению, можно думать только о способах, которые были бы ужасно более сложным, чем просто добавление родителя. –

+0

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

+0

Если сообщение статуса не знает его родителя или коллекцию, к которой он был добавлен, как вы можете узнать, где он находится? Вы должны пройти его из корня: [List.contains] (http://docs.oracle.com/javase/8/docs/api/java/util/List.html#contains-java.lang.Object-) является ваш друг. Но для требования, которое вы отправили, самым простым способом было бы добавить родительское поле. – Seelenvirtuose

ответ

0

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

Возможно, вы просто хотите добавить поле parent (и не забудьте установить его правильно).

1

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

Если у вас есть такое требование, самым простым способом является добавление поля parent в ваш класс StatusMessage. Но убедитесь, что справиться с ней правильно:

  1. Удалить сорбент для внутреннего List детей. Никто из внешних сообщений статуса не должен иметь права манипулировать этим списком. Фактически, этот список является детальностью реализации.

  2. Вместо этого добавьте метод addChild или addToParent (или оба) в ваш класс. Эти методы должны правильно обрабатывать предок-потомок:


public void addChild(StatusMessage child) { 
    if (child.parent != null) { 
     child.parent.children.remove(child); 
    } 
    child.parent = this; 
    children.add(child); 
} 

public void addToParent(StatusMessage parent) { 
    if (this.parent != null) { 
     this.parent.children.remove(this); 
    } 
    this.parent = parent; 
    this.parent.children.add(this); 
} 
+0

Спасибо за предложение. Моя забота заключалась в поддержании согласованности в поддержании ссылки между родителем и дочерним элементом, если я добавляю ссылку в дочерний объект. Ваше предложение будет полезно для поддержания этой ссылочной целостности, поскольку список не отображается снаружи для манипуляций. Благодарю вас за ваше предложение. :) – tpuli

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