Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 一个对象是否应该知道其他对象拥有它?_Java_Oop - Fatal编程技术网

Java 一个对象是否应该知道其他对象拥有它?

Java 一个对象是否应该知道其他对象拥有它?,java,oop,Java,Oop,例如,我有两个类:Book和Customer。客户有一个包含其购买的所有书籍的列表。使用此设计,我可以轻松查找客户的购买历史记录 然而,如果我想知道有多少客户购买了一本特定的书,通常我会查找所有客户的购买历史,找到购买了这本特定书的客户。这可能是一个耗时的查找过程。我想知道在Book类中添加一个列表,并将购买这本书的所有客户添加到此列表中是否是更好的方法 我不知道我的方法在设计方面是否更好/更差。这无疑使Book Customer强耦合,但我不确定是否有其他方法来实现这种方法。即使是引用书籍列表

例如,我有两个类:Book和Customer。客户有一个包含其购买的所有书籍的列表。使用此设计,我可以轻松查找客户的购买历史记录

然而,如果我想知道有多少客户购买了一本特定的书,通常我会查找所有客户的购买历史,找到购买了这本特定书的客户。这可能是一个耗时的查找过程。我想知道在Book类中添加一个列表,并将购买这本书的所有客户添加到此列表中是否是更好的方法


我不知道我的方法在设计方面是否更好/更差。这无疑使Book Customer强耦合,但我不确定是否有其他方法来实现这种方法。

即使是引用书籍列表的Customer类也不是很好

让Customer类和Book类彼此不知道。而是维护地图以供快速参考。e、 g.-

Map<Customer, List<Book>> customerToBooks;
Map<Book, List<Customer>> bookToCustomers;
Map customerToBooks;
将书籍映射到客户;

并通过
assignBook(客户c,图书b)
returnBook(客户c,图书b)
方法操作这些映射

您可以做的一件事是检查客户类中的列表,检查图书购买历史,如下所示:

Customer.java

public class Customer{
    public Set<Book> purchases = new HashSet<Book>();

    public void purchaseBook(Book b){
        purchases.add(b);
    }
}
公共类客户{
public Set purchases=new HashSet();
公开作废采购书(b册){
添加(b);
}
}
原始类别:

public Set<Customer> customers = new HashSet<Customer>();

public Set<Customer> getCustomersFromBook(Book b){
    Set<Customer> ret = new HashSet<Customer>();
    for(Customer c : customers){
        if(c.purchases.contains(b)){
            ret.add(c);
        }
    }
    return ret;
}
publicsetcustomers=newhashset();
公共设置GetCustomerFromBook(b册){
Set ret=new HashSet();
用于(客户c:客户){
如果(c.包含(b)){
再加上(c);
}
}
返回ret;
}

或者你也可以做同样的事情,但是客户在
图书
类中的
集合
中。

理想情况下,单纯地说,图书和客户都不应该相互了解。我将创建第三个类,Purchase,包含对客户和书籍的引用、订购日期、发货日期、支付价格等


然后我会有一张
地图
和一张可选的
地图

图书清单,以及谁购买了属于书店的东西,而不是书。是否可以为每本书设置一个计数器,即a书的5份副本,并为每一位取出靴子的客户减去计数?这样,你就知道总共有5本书,3本被拿出来,剩下2本了。这也将有助于解决“缺货问题”,它不会占用更多的内存/存储空间吗?我的意思是,我已经有了Customer和Book对象,添加更多的对象似乎会消耗内存。今天,内存/存储空间会完全不受关注吗?@hybpro它只会增加少量额外的内存使用。类定义本身使用的内存量可以忽略不计。是对象(实例)占用了大部分内存,添加一个Purchase类只会为每个实例增加少量额外的内存需求,因为Purchase类中的大多数字段都会出现在Customer或Book类中。因此,您正在移动字段,而不是添加新字段。这增加的灵活性通常是值得的——除非你使用的是内存严重受限的设备,比如非常旧的智能手机。