0

设置

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

每个人的运动衫的颜色都来自他们所在小组的颜色。(注意:如果他们不属于某个组,他们的毛衣是灰色的。)

当我在屏幕上绘制一个 Person 时,我会接收 Person 本身和一个颜色。

编码

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) { //... }

问题 组和人员都相互引用 - 我担心一个可能会与另一个不同步。我的绘图代码必须修复(因为它是外部的),但是在这个设计中有什么明显的我做错了吗?

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

4

4 回答 4

3

您可以为每个类引入设置器,以允许任一实体修改另一个实体和自身,以使它们永远不会不同步。例如

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;
    }
}

您可以对添加组成员执行相同的操作。

于 2012-08-30T17:55:22.187 回答
1

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

于 2012-08-30T17:55:35.643 回答
1

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

public class Group {

    public Person createPerson() { ... }

    public class Person {
        private Person() { ... }
        ...
            Group.this
        ...
     }
}
于 2012-08-30T17:55:38.870 回答
1

请记住,Group 用于添加/删除人员的公共方法必须更新 Person 对 Group 的引用,反之亦然:

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);
        }
    }
}
于 2012-08-30T18:33:15.440 回答