次のようなコードがあります。
void processObjectRecursively(Object obj)
{
Field[] fields = obj.getClass().getDeclaredFields();
for(Field field : fields)
{
FieldType type = FieldUtils.getType(field); // FieldType is enum
Object value = field.get(obj);
switch(type)
{
case A:
processObjectRecursively(value);
continue;
case LIST:
processList((List<?>)value);
continue;
case B:
processB(value);
continue;
case C:
processC(value);
continue;
}
}
}
void processList(List<?> list)
{
for(Object obj : list)
{
processObjectRecursively(obj);
}
}
void processB(Object obj)
{
// do something
}
void processC(Object obj)
{
// do something
}
今。私はこの長いスイッチケースが好きではありません。したがって、コマンドを作成し、タイプがキーで値が対応するコマンド オブジェクトである Map に入力することを考えています。これにより、メソッドは次のようになります。
void processObjectRecursively(Object obj)
{
Field[] fields = obj.getClass().getDeclaredFields();
for(Field field : fields)
{
FieldType type = FieldUtils.getType(field); // FieldType is enum
Object value = field.get(obj);
Command command = commandMap.get(type);
command.execute(value, this); // 'this' needed for calling processObjectRecursively()
}
}
しかし、そのためには、1 つのインターフェースとさらに 4 つのクラスを作成する必要があります。では、このアプローチは大丈夫ですか、それとも過度に設計されていますか? 同じ効果を達成するための他のより簡単なアプローチを提案できますか?