2016-03-14 7 views
0

Вот моя проблема. У меня есть Task и Tasklist.Двунаправленные отношения на Java

public class Task { 
    private Tasklist task list; 

    public void setTasklist(Tasklist tasklist) { 
    // the code 
    } 
} 

public class Tasklist { 
    private List<Task> tasks; 

    public void addTask(Task task) {} 
    public void removeTask(Task task) {} 
} 

То, что я хочу это: Я хочу, чтобы обновить список задач, когда пользователь изменяет TaskList переменных задач

Так что, если я исполню

Tasklist myTasklist = new Tasklist(); 
Task myTask = new Task(); 
myTask.setTasklist(myTasklist); 

Я хочу, чтобы это ,

myTasklist.getTasks(); // => [myTask] 

наоборот, если добавить задачу к моему Tasklist Я хочу, чтобы автоматически обновлять задачи Tasklist ссылающихся

Tasklist myTasklist = new Tasklist(); 
Task myTask = new Task(); 

myTasklist.addTask(myTask); 

myTask.getTasklist(); // => myTasklist 

Я попытался решить эту проблему самостоятельно, но я всегда в конечном итоге с переполнение стека.

+1

Вам необходимо показать код, который дает вам StackOverflowError. –

+0

Нужно ли это быть простой Java? Вы можете создать модель EMF Ecore, которая предоставляет «противоположные ссылки». –

+0

Должны ли задачи разрешаться более чем в одном списке? – Andreas

ответ

3

Задача принадлежит к списку, список знает свои задачи. Легкий материал - есть только одна вещь: решение, кто добавляет, что к чему?

Я имею в виду, как правило, вы добавляете задачу к TaskList, так что точка, чтобы смоделировать его на обратном пути? Я просто смею удалить метод setTaskList для простоты.

Теперь ясно видно, что вы добавляете новую задачу в список задач, вызывая add(). Есть только один способ добавить задачу в список задач - путем вызова функции add(). После добавления задачи в список задач этот метод добавления обновляет атрибут taskList задачи.

public class Task { 
    private TaskList taskList; 
} 

public class Tasklist { 
    private List<Task> tasks; 

    public void addTask(Task task) { 
     tasks.add(task); 
     task.taskList=this; // belongs to this list now 
    } 
    public void removeTask(Task task) { 
     tasks.remove(task); 
     task.taskList=null; // belongs to no tasklist 
    } 
} 
+0

Большое спасибо, я не видел эту новую перспективу. – TimKaechele

0

... И вы попали в stackoverflow.

Циклическая зависимость редко является хорошей идеей. Вопрос: спросить себя: может ли задача существовать без Tasklist? Может ли список задач существовать без знания его задач?

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

Однако для этого поблема вы получите переполнение стека, если вызов, который вы отмечаете в TaskList, вызовет что-то в Задаче, которая вызовет тот же метод TaskList.

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