1

六角形グリッドを処理できるライブラリを作成しています。

ユーザーはHexagonGridBuilder、グリッドの幅、高さ、およびその他の多くのパラメーターを設定できるオブジェクトにアクセスでき、そのbuild()メソッドはHexagonGridオブジェクトを返します。には、 を取得するためのHexagonGridさまざまな方法がありますHexagon(たとえば、グリッド座標またはピクセル座標による)。

私の問題は、ユーザーが の各Hexagonオブジェクトに任意の衛星データを配置できるようにしたいということですHexagonGrid。そうするためのベストプラクティスは何ですか?

ユーザーが衛星データを に渡せるようにするための一般的なメソッドを提供できますHexagon

private Object satelliteData;

public <T> void setSatelliteData(T satelliteData) {
    this.satelliteData = satelliteData;
}

@SuppressWarnings("unchecked")
public <T> T getSatelliteData() {
    return (T) satelliteData;
}

これには、型が何であるかを確認せずにオブジェクトをキャストする必要があるため、明らかに欠陥があります。

my を変更してHexagonGridBuilder、ユーザーが衛星データのオブジェクトを渡すことができるようにします。これにより、ユーザーがClass正しい型を提供したかどうかを検証できます。

   public <T> void setSatelliteData(T satelliteData) {
    if (!satelliteClass.isAssignableFrom(satelliteData.getClass())) {
        // throw some exception
    }
    this.satelliteData = satelliteData;
}

ただし、これにはまだgetSatelliteData()メソッド内の未チェックのキャストが含まれます。

@SuppressWarnings("unchecked")
public <T> T getSatelliteData() {
    return (T) satelliteData;
}'

適切な解決策は、ライブラリ全体をジェネリックにしているように見えるので、サテライト データ型のジェネリック パラメータがありますが、関連するすべてのクラスをジェネリックにする必要があります。

HexagonGrid<SATELLITE_DATA_TYPE> hexagonGrid =
new HexagonGridBuilder<SATELLITE_DATA_TYPE>().build();

だから、どれを選べばいいのかわからない。最もハッキーでないソリューションはどれですか? それとも、私が考えていなかったことが他にありますか?

編集:私が本当に知りたいのは、関連するすべてのクラスをジェネリックにするのに苦労する価値があるか(これにより、理解が難しくなり、少し面倒になります)、または2つのジェネリックメソッドとプラスメソッドで逃げることができるということです私のビルダーでクラスを提供しますか? その理由は、ユーザーが衛星データをまったく使用しない可能性があるため、大騒ぎになるからです。

4

1 に答える 1

3

メソッドだけでなく、クラス<T>全体に型パラメーターとして配置する必要があります。HexagonGrid次に、フィールドを として定義し、メソッドprivate T satelliteData<T>s を削除して、明示的なキャストを削除できます。これは基本的に、前回お話ししたアプローチです。

コンストラクターではなくビルダーを使用する理由がある場合は、必ずしもビルダーをジェネリック化する必要はありません。build型パラメーターをメソッドに渡すことができます。これがどのように見えるかの例については、EnumSet#noneOfを参照してください。

(また、残りの要件を考慮して、 type parameterの作成<T extends Satellite>、またはベースのサテライト インターフェイスが何であれ、検討することをお勧めします。)

于 2013-08-10T12:52:51.167 に答える