0

私は持っている

interface Module {
    List<String> parse();
}

HashSet<Module>インターフェイスにはいくつかの実装があり、アプリケーションでは、各モジュールのインスタンスが 1 つだけであることを保証したいと考えています。このためにはhashCode、各クラスに適切なものが必要です。の適切な実装はhashCode、1 つのモジュール クラスのさまざまなインスタンスに対して同じ定数を返すが、異なるモジュールに対しては異なる定数を返すものです。

素敵な設計ソリューションを作成するには、次のようにモジュールの名前から hashCode を計算したいと思います。

public int hashCode() {
    return ConcreteModule.class.getName().hashCode();
}

しかし、このコードはインターフェイスのすべての実装で同じです...私の考えは、ハッシュコードを実装する抽象モジュールを作成することでしたが、この抽象クラスを拡張するクラスの名前に到達することは可能ですか? お気に入り:

public abstract class AbstractModule implements Module {
    public int hashCode() {
        // get the class name of class extending the abstract module
        // and return hashcode of its string name
    }
}

その後

public class ConcreteModule extends AbstractModule implements Module {
    // implementation of parse() no need to create hashcode for each module
}

モジュールごとに hashCodes を作成することをお勧めしますか、それとも私が試しているものを作成することは可能ですか? 提案やアドバイスは大歓迎です。前もって感謝します

4

3 に答える 3

1

次のように簡単に実装できます。

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

@Override
public final boolean equals(Object other) {
    if (other == this) {
        return true;
    }
    if (other == null) {
        return false;
    }
    return other.getClass().equals(this.getClass());
}

しかし、それが最善のアイデアかどうかはわかりません。さらに、インターフェイスのすべての実装が抽象クラスを拡張することを保証することはできません。

単純にMap<Class<? extends Module>, Module>. 各モジュールの実装はそれ自体をレジストリに追加し、モジュールのクラスが既にマップにある場合は、単に新しいモジュール インスタンスを拒否または無視します。

于 2013-05-03T17:58:07.623 に答える
1

どうですか:

return getClass().getName().hashCode();

ただし、次のように簡単に使用できます。

return getClass().hashCode();
于 2013-05-03T17:56:27.017 に答える