1

SetJava で BusinessObjectsを使用することを考えています。私の意図は、各セットには各ビジネス オブジェクトのインスタンスが 1 つだけ存在する必要がありますが、1 つのビジネス オブジェクトを多くのセットで共有できるということです。したがって、例として:

BO1 - instance of BusinessObject1
BO11 - instance of BusinessObject1
BO2 - instance of BusinessObject2

正解です

[BO1、BO2] または [BO1]

しかし、これは[BO1、BO11]ではありません

これが強制されていることを確認したかったので、AbstractBusinessObject を次のように指定することを考えていました。

public abstract class AbstractBusinessObject {

    @Override
    public int hashCode() {
        return this.getClass().getName().hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        if (obj != null)
            return this.getClass() == obj.getClass();
        return false;
    }
}

それは良い考えだと思いますか。

4

4 に答える 4

4

単に列挙型を使用しないのはなぜですか? Enumビジネス オブジェクトおよびビジネス オブジェクトを使用できますEnumSet

public enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
    THURSDAY, FRIDAY, SATURDAY;
    static final EnumSet<Day> weekend = EnumSet.of(SATURDAY,SUNDAY);
}

チュートリアルはこちら

ビジネスオブジェクトが上記の目的のために設計されていない場合は、通常の方法で equals と hashcode を実装してください。HashSet add メソッドはとにかく重複を無視します。

このリンクでは、equals と hashcode の契約について説明しています。

ビジネス オブジェクトの一般的なルールは等しいため、ビジネス オブジェクト PK を使用してハッシュコードを実装する必要があります。

同様に、従業員オブジェクトの従業員番号はビジネスキーと見なすことができ、pk は異なる可能性があるため、従業員番号に基づいて等号とハッシュコードを作成する必要があります。

于 2012-09-26T18:22:37.323 に答える
3

いいえ、これは悪い考えです。これは実際には、コードのさまざまなセクションの実行を妨げるものではありません

BusinessObject bo1 = new BusinessObject();
bo1.setId(1);
bo1.setName("foo");

BusinessObject bo1copy = new BusinessObject();
bo1copy.setId(1);
bo1copy.setName("bar");

したがって、異なるフィールド値を持つ同じ「ビジネス オブジェクト」の 2 つのコピーを持つことになります。

あなたの equals() 実装は、 のすべてのインスタンスもBusinessObject同じ値 (bo1.equals(bo1copy) == true上記のコードで) を持つものとして扱います。

プログラムでインスタンス化された特定のタイプのインスタンスの数を制御する必要がある場合は、オブジェクトのインスタンスを 1 つだけインスタンス化します。

于 2012-09-26T18:24:11.440 に答える
2

すべてのビジネス オブジェクトを HashSet にスローします。HashSet に (equals メソッドによって) 重複を含めることはできないため、B1、B11、および B2 を HashSet にスローすると、B1 および B2 が含まれます。

BusinessObject を一意にするこれらの属性を操作するには、BusinessObject の equals および hashCode メソッドをオーバーライドする必要があります。

于 2012-09-26T18:26:00.270 に答える
0

何らかの理由で AmitD のアドバイスに従って Enum を使用できない場合は、Sets の代わりに、マーカー インターフェイスでキー設定された Maps を使用できます。

これがどのような問題を解決するのかわかりませんが、...

  1. 新しいマーカー インターフェイスを作成する
  2. 各ビジネス オブジェクト クラスにそれを実装させる
  3. 説明したようにコレクションが必要な各場所で、使用します

    Map<Class<? extends Marker>, Marker> soloBOMap = // whatever concrete map;
    soloBOMap.put(bo.getClass(), bo);
    

それは奇妙だ; それは確かです。

于 2012-09-26T18:40:27.143 に答える