2012-04-01 2 views
1

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

Скажем, у меня есть Entity:

class Work{ 
User manager; 
} 

class User{ 
    List works; 
} 

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

Я боюсь, что будет бесконечное отношение гнезда.

Так что я задаюсь вопросом, следует ли избегать этого или нет?

+1

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

+0

Двусторонние отношения не должны быть предпочтительными, но иногда их трудно избежать. Опасно, например, если ваши классы реализуют toString(). – nansen

ответ

2

Нет проблем с этим двунаправленным отношением. Вы, кажется, беспокоят какое-то петля вызывается из обходе User к Work и обратно и т.д.

Спросите себя, нужно ли вам получить Work S дан User И User дало Work. Если это так, то имеет смысл хранить двунаправленные ссылки.

+1

согласились, но это могут быть методы, которые не обязательно являются переменными-членами. – Randy

1

Нет проблем с этим видом двусторонней ссылки. Единственная ситуация, в которой я могу думать о том, где вы могли бы попасть в «бесконечное гнездование», - это то, что код в обоих классах попал в взаимное вызов методов, например.

class Work { 
    User manager; 

    public void doWorkStuff() { 
    manager.doUserStuff() { 
    } 
} 

class User { 
    Work works; 

    public void doUserStuff() { 
    works.doWorkStuff(); 
    } 
} 
0

Этот вид сценария зависит от дизайна. Какими отношениями связаны «Работа и Пользователь»? Это 1: m, m: 1 или m: n? Исходя из этого результата, мы должны соответствующим образом разработать класс.

Основываясь на вашем вопросе, я вижу, что 1 пользователь может иметь несколько Работ (Список работ), но 1 Работа может иметь только 1 пользователя. Следовательно, пользователь в классе «Работа» будет сущностью для определения владельца работы. Следовательно, назовите его, соответственно, clas Work {private User owner; ....}

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