我的代码类似于以下内容:
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,其中type是键,值是相应的命令对象。有了这个,该方法看起来像:
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()
}
}
但为此,我需要创建一个接口和另外四个类。那么这种方法还可以,还是过度设计?你能否提出任何其他更简单的方法来达到同样的效果?
答案 0 :(得分:2)
这里的命令模式听起来不错。但我宁愿寻找使用各种值类型来解决这个问题的可能性,而不是使用Object
。所以,我可以简单地写下面的单行,
value.process()
答案 1 :(得分:1)
如果有新的处理类型会发生什么。在第一种方法中,您将添加案例。如果在开关中。如果使用命令模式,则需要注入新命令及其类型及其启动和运行。我会在任何一天使用第二种方法
为什么你需要传递这个? recurciveProcessing可以是使用map获取命令来处理请求的命令吗?
答案 2 :(得分:1)
我同意最好避免切换案例陈述。所以创建一个命令图就行了。另一种更简单的方法是在您的枚举中添加流程方法,以便每个枚举类型都知道如何处理数据。
答案 3 :(得分:0)
切换块没有问题。 JVM有很好的处理方式,不会影响性能。