2016-03-14 96 views
0

这是我的问题。我有一个任务和一个任务列表。爪哇双向关系

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 myTasklist = new Tasklist(); 
Task myTask = new Task(); 
myTask.setTasklist(myTasklist); 

我希望看到这个更新任务列表。

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

反之亦然,如果我加一个任务到我的任务列表,我希望它自动更新任务列表引用

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

myTasklist.addTask(myTask); 

myTask.getTasklist(); // => myTasklist 

我试图解决我自己的问题的任务,但我总是结束了堆栈溢出。

+1

你需要显示给你StackOverflowError的代码。 –

+0

它必须是纯Java吗?你可以创建一个EMF Ecore模型,这些模型提供了“反向引用”。 –

+0

应该在多个列表上允许任务吗? – Andreas

回答

3

任务属于一个列表,列表知道它的任务。简单的东西 - 只有一样东西不存在:决定谁加什么东西?

我的意思是,通常你添加一个任务任务列表,那么什么是它的模型在对面的方式呢?为了简单起见,我敢于删除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的调用将调用Task中的任何东西,将调用TaskList的相同方法,则会发生堆栈溢出。