6

假设我有两门课:一类是乐队,另一门是 CD。我希望能够轻松访问一个乐队的所有 CD 并找到一张 CD 的乐队。

我的解决方案是Band在 CD中有一个字段,ArrayList<CD>在 Band 中有一个字段。

但我认为这不是一个好的解决方案。有谁知道这种情况的更好设计?

4

4 回答 4

4

我明白你为什么不喜欢这个解决方案。

您只存储一次信息,但您必须更新两个类中的更改。

如果更改Banda CD,则必须CD从旧的中删除 ,在 中Band设置,然后将其添加到新的。BandCDBand

这当然很复杂并且容易出错。

你的类没有简单的getter/setter。相反,您必须在域类中实现大量逻辑以保持一致性。

当然,优点是你总是有一个可访问的BandCD反之亦然。它是一种权衡。一个必要的,例如,如果您使用 a作为其实现CD的一部分。Bandequals

这是一个有趣的替代方案,在某些情况下可能是有利的:

使用您的类Band并且CD仅作为简单的 POJO 并使用另一个类(即MusicService)来解决关系:

class MusicService {
  Band getBand(CD cd);
  List<CD> getCDs(Band band);
  addCD(Band band, CD cd);
}
  • 优点:关注点分离、无状态服务
  • 缺点:代码较多
于 2013-08-29T13:01:53.767 回答
1

您的解决方案完全有道理。实际上,这就是原理JPA。请参阅Java 持久性/OneToMany。JPA 是关于如何实现自己的 ORM 的一个很好的参考。

于 2013-08-29T12:14:18.130 回答
0

您没有将信息存储两次: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;
 }
}
于 2013-08-29T12:19:56.827 回答
0

您可以Set在 Band 类中拥有一张 CD。

或者,在 Band 类中保留一个唯一 ID,该 ID 将每个唯一 Band 映射到多张 CD。

根据我的理解,CD 中不需要有 Band 字段。

于 2013-08-29T11:50:26.990 回答