假设我有两个类:一个用于Band,一个用于CD。我希望能够轻松访问一个乐队的所有CD并找到CD的乐队。
我的解决方案是在CD中使用字段Band
,在频段中使用ArrayList<CD>
。
但我发现这不是一个好的解决方案。有没有人知道这个场景有更好的设计?
答案 0 :(得分:3)
我明白为什么你不喜欢这个解决方案。
您只存储一次信息,但必须在两个类中更新更改。
如果您更改Band
的{{1}},则必须从旧版CD
中移除CD
,在{{Band
中设置Band
1}},然后将其添加到新的CD
。
这当然很复杂,容易出错。
您的课程没有简单的getter / setter。相反,您必须在域类中实现大量逻辑以保持一致性。
当然,优势在于您总是Band
Band
可访问,反之亦然。这是一个权衡。例如,您应该使用CD
的{{1}}作为其CD
实施的一部分。
这是一个有趣的替代,在某些情况下可能是有利的:
仅将您的课程Band
和equals
用作简单的POJO,并使用其他课程(即Band
)来解决这种关系:
CD
答案 1 :(得分:1)
你的解决方案完全有道理。实际上,这是JPA
的原则。
见Java Persistence/OneToMany。 JPA是如何实现自己的ORM的很好的参考。
答案 2 :(得分:0)
你可以在Band类中拥有Set
张CD。
或者,在Band类中保留一个唯一的ID,它将使用多张CD映射每个唯一的Band。
根据我的理解,CD中不需要有Band字段。
答案 3 :(得分:0)
您没有存储两次信息:CD只保存指向Band类的指针。 如果在C ++中完成,那么这需要一些思考(例如,cd中的weak_ptr到Band以避免循环引用),但是在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;
}
}