0

セットアップ

私の Java コードには、Group と Person という 2 つのオブジェクトが含まれています。各グループには複数の個人への参照を含めることができますが、各個人は 1 つのグループにのみ属することができます。

各人のスウェットシャツの色は、グループの色に由来します。(注: グループに属していない場合、セーターはグレーです。)

画面に人物を描くときは、人物そのものと色を取り込みます。

コード

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

Problem Group と Person はどちらもお互いを参照しています。描画コードを修正する必要があります (外部のものであるため) が、この設計で明らかに間違っている点はありますか?

編集: もう 1 つ注意 - グループはプログラム全体で変更される可能性があります。個人のグループは場所に依存するため、常にグループを切り替えています。

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()グループから人のリストを取得していますか、つまり、実際にコードで呼び出していますか? 次に、T シャツの色を取得するためにfromPersonへの接続も使用するため、2 つのクラス間の双方向接続が必要になります。Groupを使用しない場合getPeople()、グループ内のユーザーのリストを保持する必要はなく、 からGroupへの接続はPerson不要になります。

于 2012-08-30T17:55:35.643 に答える
1

Person にコンテナー (Group) を格納しない方法の 1 つは、Person を Group の内部クラスにすることです。実際、それが内部クラスの主な目的です。

public class Group {

    public Person createPerson() { ... }

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

人を追加/削除する Group の public メソッドは、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 に答える