Heres a design question。 Fooオブジェクトのマップをスーパークラスに格納し、より特定のオブジェクトにルックアップをキャストするのは悪い習慣でしょうか?すなわち:スーパータイプのマッピングとサブタイプの取得
Map<Integer, Foo> lookup = new HashMap<>();
lookup.put(0, new Bar()); //Bar extends Foo
lookup.put(1, new Fizz()); // Fizz extends Foo
public Bar getBarById (int barId){
(Bar)lookup.get(barId);
}
上記のアプローチはどのように脆弱でしょうか? Java8でより良い方法があるのか、それとも私が似たようなことをするためのより良いデザインパターンがありますか?
答えは、オブジェクトが使用され、なぜあなたがそれらを保存しているかに依存します。たとえば、オブジェクトが使用したい標準インターフェースを実装している場合は、そのインターフェースをMap値の型に使用し、型キャストを心配する必要はありません。 –
ルックアップの後の@JEarlsルックアップオブジェクトのフィールドにアクセスしたいです。インターフェイスにこれらのメソッドがすべて含まれているわけではありません。たとえば、クラスバーだけがgetname()を持っていたので、そのメソッドを使用する前に型を知る必要がありました –
どの代替手段と比較しましたか? – Holger