假设我有两门课:一类是乐队,另一门是 CD。我希望能够轻松访问一个乐队的所有 CD 并找到一张 CD 的乐队。
我的解决方案是Band
在 CD中有一个字段,ArrayList<CD>
在 Band 中有一个字段。
但我认为这不是一个好的解决方案。有谁知道这种情况的更好设计?
假设我有两门课:一类是乐队,另一门是 CD。我希望能够轻松访问一个乐队的所有 CD 并找到一张 CD 的乐队。
我的解决方案是Band
在 CD中有一个字段,ArrayList<CD>
在 Band 中有一个字段。
但我认为这不是一个好的解决方案。有谁知道这种情况的更好设计?
我明白你为什么不喜欢这个解决方案。
您只存储一次信息,但您必须更新两个类中的更改。
如果更改Band
a CD
,则必须CD
从旧的中删除 ,在 中Band
设置,然后将其添加到新的。Band
CD
Band
这当然很复杂并且容易出错。
你的类没有简单的getter/setter。相反,您必须在域类中实现大量逻辑以保持一致性。
当然,优点是你总是有一个可访问的Band
,CD
反之亦然。它是一种权衡。一个必要的,例如,如果您使用 a作为其实现CD
的一部分。Band
equals
这是一个有趣的替代方案,在某些情况下可能是有利的:
使用您的类Band
并且CD
仅作为简单的 POJO 并使用另一个类(即MusicService
)来解决关系:
class MusicService {
Band getBand(CD cd);
List<CD> getCDs(Band band);
addCD(Band band, CD cd);
}
您的解决方案完全有道理。实际上,这就是原理JPA
。请参阅Java 持久性/OneToMany。JPA 是关于如何实现自己的 ORM 的一个很好的参考。
您没有将信息存储两次:CD 仅包含指向类 Band 的指针。如果在 C++ 中完成,那么这将需要一些思考(例如,在 CD 中为 Band 设置一个 weak_ptr 以避免循环引用),但在 Java 中,当 Band 没有在其他任何地方引用时,GC 将负责删除这两个对象。
您可以通过编写一些处理此问题的代码来确保某种一致性(例如 CD 仅在一个波段中),如下面的代码(警告:未测试):
class Band
{
private List<CD> m_cds;
public void addCD(CD cd)
{
id(cd.getBand() == this)
{
return;
}
if(cd.getBand() != null)
{
cd.getBand().removeCd(CD cd);
}
cd.setBand(this);
m_cds.add(cd);
}
public void removeCd(CD cd)
{
cd.setBand(null);
m_cds.remove(cd);
}
}
class CD
{
private Band m_band;
public void setBand(Band band)
{
m_band = band;
}
public Band getBand()
{
return m_band;
}
}
您可以Set
在 Band 类中拥有一张 CD。
或者,在 Band 类中保留一个唯一 ID,该 ID 将每个唯一 Band 映射到多张 CD。
根据我的理解,CD 中不需要有 Band 字段。