有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何防止双向关系中的循环

假设我们有以下两个实体

public class Library
{
    private Collection<Book> books = new ArrayList<Book>();

    public boolean add(Book book)
    {
        return books.add(book);
    }
    public boolean remove(Book book)
    {
        return books.remove(book);
    }
}

书籍

public class Book
{
    private Library library;
    public setLibrary(Library library)
    {
        this.library = library;
    }
}

这是一种双向关系,很可能很快就会破裂。即使向库中添加了一本书,该书的库也不会更新。即使你更新了一本书的图书馆,图书馆也不会更新

那么,您将如何以良好的方式保持这种双向关系?我当然可以在setLibrary中做一个add+remove,反之亦然,但就我所知,这将导致一个循环,可能以StackOverflowError结束


共 (4) 个答案

  1. # 1 楼答案

    我是在装傻吗

    public boolean add(Book book)
    {
       book.setLibrary(this);
       return books.add(book);
    }
    public boolean remove(Book book)
    {
       book.setLibrary(null);
       return books.remove(book);
    }
    
  2. # 2 楼答案

    为关系定义“所有者”。图书馆是“拥有”这本书还是这本书拥有图书馆

    这个问题的答案告诉你谁更新了“奴隶”实体

    我觉得图书馆拥有这本书,所以“将书添加到图书馆”代码应该进入图书馆,然后更新后面的参考资料

  3. # 3 楼答案

    在您提出的解决方案中,您不能检查引用是否相等以避免循环吗

    public boolean add(Book book)
    {
       if(book.getLibrary != this) book.setLibrary(this);
       return books.add(book);
    }
    
  4. # 4 楼答案

    虽然我会推荐Aaron定义关系所有者的方法,但另一种允许set/add/remove方法保持不变的方法是,也定义相应的has方法(hasBookLibraryhasLibraryBook)。在调用关系另一端的addremove方法之前,首先查询它是否已经存在,如果不存在,则不调用它