2012-08-30 23 views
0

设置有什么办法可以设计我的Java代码,所以这两个对象不会自引用?

我的Java代码包含两个对象:一个组和一个人。每个组可以包含对多个人的引用,但每个人只能属于一个组。

每个人的运动衫的颜色都是从他们团体的颜色中推导出来的。 (注意:如果他们不属于某个团体,他们的毛衣就是灰色的。)

当我在屏幕上绘制人物时,我会自己接受人物和颜色。

守则

public class Person { 
    Color sweatshirtColor = Color.gray; 
    Group belongsToGroup = null; 

    public void setGroup(Group g) { belongsToGroup = g; } 
} 

集团

public class Group { 
    Color color = Color.red; 
    List<Person> people = new ArrayList<Person>(); 
    // ... setters for adding and getting people 
} 

绘制

public void draw(Person dudette, Color shirtColor) { //... } 

的问题 集团和个人都互相参考 - 我担心人们可能不同步与其他。我的绘图代码必须修复(因为它是外部的),但是在这个设计中有什么明显的我做错了吗?

编辑:还有一点注意 - 团队可以在整个程序中进行更改。一个人的小组取决于他们的位置,所以他们不断地切换小组。

+0

你尝试用ThreadLocal的? – Chris

+0

这些对象是从数据库填充的吗?同步问题可以通过身份映射模式来解决。因此,每个对象只有一个实例。 –

+0

我认为这些对我的意图来说是过分的。 – sdasdadas

回答

3

您可以将setter引入到每个类中,以允许任何实体修改另一个实体,从而避免它们不同步。例如。

class Group { 
    List<Person> people; 
    void removePerson(Person p) { 
     if(people.remove(p)) 
      p.removeFromGroup(); 
    } 
} 

class Person { 
    Group grp; 
    void removeFromGroup() { 
     grp.removePerson(this); 
     grp = null; 
    } 
} 

您可以添加组成员。

+0

这对我很有吸引力 - 我只是在考虑其他答案。谢谢! – sdasdadas

1

你是否从一个组获得人员列表,即你是否真的在代码中调用Group#getPeople()?然后,您需要两个类之间的双向连接,因为您还使用PersonGroup之间的连接来获取T恤颜色。如果您不使用getPeople(),则不需要保留组中的人员列表,然后从GroupPerson的连接将不是必需的。

+0

是的,我确实需要使用getPeople()。 – sdasdadas

1

在Person中不存储容器(Group)的一种方法是使Person成为Group的内部类,实际上这是内部类的主要目标。

public class Group { 

    public Person createPerson() { ... } 

    public class Person { 
     private Person() { ... } 
     ... 
      Group.this 
     ... 
    } 
} 
+0

这对我的用法没有太大意义,因为还有其他人可以属于的东西(除了一个组)。但如果我只有一个“团队”,这是一个很好的答案。 – sdasdadas

1

请记住,集团的公开方法来添加/删除的人必须更新到组,反之亦然人的引用:

public class Person { 
    public static final Color DEFAULT_COLOR = Color.GRAY; 

    private Group group; 

    // If group is not assigned returns default color 
    public Color getColor() { 
     return group != null ? group.getColor() : DEFAULT_COLOR; 
    } 

    public Group getGroup() { 
     return group; 
    } 

    // This way you will always have Person.group and Group.people in sync 
    public void setGroup(Group newGroup) { 
     if (group != newGroup) { 
      if (group != null) { 
       Group oldGroup = this.group; 
       group = null; 
       oldGroup.removePerson(this); 
      } 
      group = newGroup; 
      if (newGroup != null) { 
       newGroup.addPerson(this); 
      } 
     } 
    } 
} 

public class Group { 
    private final List<Person> people = new ArrayList<Person>(); 
    private Color color; 

    public Color getColor() { 
     return color; 
    } 

    public void setColor(Color color) { 
     this.color = color; 
    } 

    public void addPerson(Person person) { 
     if (person != null) { 
      people.add(person); 
      person.setGroup(this); 
     } 
    } 

    public void removePerson(Person person) { 
     if (people.remove(person)) { 
      person.setGroup(null); 
     } 
    } 
} 
相关问题