六角形グリッドを処理できるライブラリを作成しています。
ユーザーは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つのジェネリックメソッドとプラスメソッドで逃げることができるということです私のビルダーでクラスを提供しますか? その理由は、ユーザーが衛星データをまったく使用しない可能性があるため、大騒ぎになるからです。