假设我有一个 Person 类,其中包含 Dog 对象的集合。这种关系是双向的。
public class Person {
private List<Dog> dogs;
// getter and setter for dogs
}
public class Dog {
private Person person;
// getter and setter for person
}
现在,如果我只是处理这些对象,我会在 Person 中提供添加狗和删除狗的方法,这样客户端就不会直接处理该集合。
public void removeDog(Dog dog) {
dogs.remove(dog);
dog.setPerson(null);
}
public void addDog(Dog dog) {
dog.setPerson(this);
dogs.add(dog);
}
或者类似的东西。
我的问题是在服务层中使用这些对象时出现的。我可以通过 addDog 添加一条新狗给一个人,然后简单地保存该人,它将自动保留新狗。但是,通过removeDog删除狗然后保存该人不会自动从持久存储中删除狗......它只会将狗引用设置为null。
所以我最终得到了类似的结果:
Dog dog = dogDAO.getDogById(int id);
dogDAO.remove(dog);
因为这是一个网络应用程序,Persons 和 Dogs 不保存在内存中,所以效果很好,而且我从未调用过 Person.removeDog()。下次我加载最初引用这只狗的人时,它将不会包含该狗,因为它已从存储中删除。同样的事情也适用于添加狗:
Person person = personDAO.getPersonById(int id);
Dog dog = new Dog();
dog.setPerson(person);
dogDAO.save(dog);
同样,这甚至可以正常工作,而且我从未调用过 Person.addDog()。
那么在我的 Person 类中使用 addDog 和 removeDog 方法有什么意义吗?
最佳答案
如果没有人工干预,这总是很难做到。一旦删除对象引用并拥有陈旧的对象。在另一个用例中,您只需删除其他对象指向的对象(列表)。这应该也是一个问题。如果这被懒惰地接受,它将覆盖很多错误。
为了简单起见,您可以将 dao 删除操作添加到 person removeDog() 中,但是从一个人身上删除狗并将其添加到另一个人的用例是不可能的。如果你知道必须把狗从人身上移走,然后把它从持久性中移走,那么问题是什么?你省得一步。所以归还被移走的狗会给你带来一个模式
dogDAO.remove(person.removeDog(dog))
亲自添加和删除不仅可以让您模仿列表行为,还可以拥有一些额外的功能。就您而言,很难决定,因为这是一个简单的设置,并且取决于 dao 内容的可访问性以及您喜欢将其放在哪里。
您至少应该对您想要支持的每个用例有一个印象。然后需要定义强制和可选的对象链接和设置。有了一些实用主义(例如,将持久性内容与对象耦合),我们就有机会做一些更容易使用的面向对象的设置(因此不易出错)
关于java - 包含集合的 Web 应用程序域对象是否应该具有 "add"和 "remove"项目方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/831319/