別のアプローチを選択します。また
- 他の人が提案しているようにポリモーフィズムを使用し、Elementを拡張してprint()メソッド(サブクラスで上書き可能)を追加するか、
- ヘルパーインターフェイスを定義し、戦略とファクトリパターンの組み合わせを使用します。
基本クラス
public class Element{}
派生クラス
public class SubElement extends Element{}
要素を印刷するためのヘルパーインターフェイス
public interface PrintHelper{
void print(Element element);
}
特定の要素に最適なPrintHelperを取得するためのファクトリ
public class PrintHelperFactory{
private final Map<Class<? extends Element>, PrintHelper> registeredHelpers =
new HashMap<Class<? extends Element>, PrintHelper>();
// Register a PrintHelper for a given Element class.
public void registerHelper(final Class<? extends Element> clazz,
final PrintHelper helper){
this.registeredHelpers.put(clazz, helper);
}
// Get the most specific PrintHelper for a given Element.
public PrintHelper getHelperForElement(final Element element){
Class<? extends Element> clazz = element.getClass();
while(!Object.class.equals(clazz)){
if(this.registeredHelpers.containsKey(clazz)){
return this.registeredHelpers.get(clazz);
}
clazz = (Class<? extends Element>) clazz.getSuperclass();
}
return null;
}
}
クライアントテストクラス、Javaアプリケーションとして実行
public class Main{
public static void main(final String[] args){
final PrintHelperFactory factory = new PrintHelperFactory();
factory.registerHelper(Element.class, new PrintHelper(){
@Override
public void print(final Element element){
System.out.println("Element");
}
});
factory.registerHelper(SubElement.class, new PrintHelper(){
@Override
public void print(final Element element){
System.out.println("Sub Element");
}
});
// test it with an Element
final Element elem = new Element();
factory.getHelperForElement(elem).print(elem);
// test it with a sub class
final Element sub = new SubElement();
factory.getHelperForElement(sub).print(sub);
}
}
出力
Element
Sub Element