java - 包含集合的 Web 应用程序域对象是否应该具有 "add"和 "remove"项目方法?

标签 java dao oop

假设我有一个 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/

相关文章:

java - 如何使用map来减少Spring MVC Web应用程序中的对象创建?

javascript - 为什么我在这个例子中得到 "Cannot read property ' text' of undefined"?

java - VMWare vRealize Operations REST API java 基本身份验证密码提示

java - Spring 启动 + 甲骨文 : Hibernate dialect is 9i when in properties it is set to 10g

java - 关于线程的问题

java - Intellij Maven 测试失败

java - Java EE 项目中的服务层是否有必要通过 DAO 层与实体对话?

java - 如何避免类的所有方法共有的重复代码?

java - Spring依赖注入(inject)泛型类型的用法

c++ - 通过构造函数制作的所有对象都具有相同的 vector