【发布时间】:2013-03-15 06:37:43
【问题描述】:
我正在创建一个带有 2 个对象的 canvas 绘图:Rectangles 和 Lines 连接矩形。每条线路都应该知道它连接的 2 个Rectangles。
每个Rectangle 可以有多条线将其连接到其他Rectangles。
class Rectangle {
List<Line> connections;
void setConnection(Line line) {
connections.add(line);
}
}
class Line {
Rectangle from, to;
public Line(Rectangle from, Rectangle to) {
this.from = from;
this.to = to;
from.setConnection(this);
to.setConnection(this);
}
}
我觉得这可能不是一个好的设计,因为当我删除一个Line 时,我还必须从它连接的Rectangle 的连接列表中删除Line。
当我删除Rectangle 时,我还必须删除连接到矩形的Lines,因为没有它们就不应该存在。因此,我必须遍历可删除Rectangle 的所有connections,并为每个connection 获取from/to rectangle,然后再次获取connection 列表并删除@987654341 @参考。
我的问题不是编写那个代码(我已经让它工作了),但在我看来,我正在做很多来回引用。
这可以做得更好吗?不知何故:如果一个矩形被删除,那么所有来自行的深层连接都会被自动删除/失效?类似于 Hibernate 的多对多级联?我不能只使用 Hibernate,因为它应该是一个客户端应用程序,没有数据库。
【问题讨论】:
-
为了删除深层连接,需要以一种或另一种方式评估它们。你可以像你一直在做的那样检查删除,或者你可以让它检查访问(将指针设置为空,然后当某些东西尝试访问它并看到空时,它会删除该行)。这样可以节省初始删除的时间,但会为每次访问增加一点开销,并且如果您实际上不访问它们,则会使用更多内存。与垃圾回收非常相似的问题 (en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29)
-
您可以使用
Map和Rectangle类型的键和Line对象的Set值(或番石榴MultiMap)。如果您有很多矩形和线条,这可以显着提高性能。当然,您会从Rectangle类中删除List行。实际上,我想我可能会介绍一个管理“连接点”并包含矩形/线图的类。 (顺便说一句,我认为使用GWT编程时最好使用具体类,例如ArrayList,而不是抽象类List?) -
好吧,
Map<Rectangle, Set<Line>>与List<Rectangle>有什么不同,Rectangle拥有private List<Line> lines?
标签: java oop gwt many-to-many java-canvas