如何避免Java

时间:2016-08-20 06:49:45

标签: java design-patterns enums switch-statement solid-principles

我有一个TriggerType枚举,可以添加不同的触发器

public enum TriggerType {
    meta,data,list,toggle
}

这些触发器类型在不同的处理程序(例如,组件,仪表板等)中使用,以识别通过switch-case在处理程序内触发的触发器,例如,下面给出了使用触发器通过switch-case的ComponentHandler的代码片段

@Override
public TriggerResultInterface executeTriggerJob(TriggerEventHelper triggerEventHelper) throws TriggerHandlerException {
    switch (triggerEventHelper.getTriggerName()) {
        case meta:
            return getMetaComponentConfig(triggerEventHelper);
        case data:
            return getComponentData(triggerEventHelper);
        default:
            LOGGER.debug(INVALID_TRIGGER_NAME_CONFIGURED);
            throw new TriggerHandlerException(INVALID_TRIGGER_NAME_CONFIGURED);
    }

}

想象一下如果我想添加一个新的Trigger,我必须更新不可避免的枚举类,同时我必须更新我需要使用Trigger的每个处理程序类,这种设计方式编码是好的还是有任何其他更好的解决方案,将增强此代码并遵循SOLID原则和更好的设计。

我想强调说这个问题不是this的重复。在这种情况下,每种类型只需要一种行为(例如:convertToMp3)。但我的问题所指的是我的枚举类型(触发器类型)依赖于可能使用的处理程序,因此每个触发器类型枚举的行为或实现将取决于它正在使用的处理程序的要求。

1 个答案:

答案 0 :(得分:3)

其中一个解决方案是使用多态来以不同方式处理触发器。例如,您可以声明Trigger接口并具有多个实现。在这种情况下,当您需要新的触发器类型时,您只需实现此接口,而不要触摸现有代码:

public interface Trigger {
    TriggerResultInterface execute(TriggerEventHelper eventHelper);
}

public class MetaTrigger implements Trigger {
    @Override
    TriggerResultInterface execute(TriggerEventHelper eventHelper) {
        // do meta trigger work here
    }
}

public class DataTrigger implements Trigger {
    @Override
    TriggerResultInterface execute(TriggerEventHelper eventHelper) {
        // do data trigger work here
    }
}

// ...

public TriggerResultInterface executeTriggerJob(TriggerEventHelper eventHelper) {
    eventHelper.getTrigger().execute(eventHelper);
}

在这种情况下,将无法添加新的触发器类型,也无法实现其行为。

如果需要默认实现,可以使用基类而不是接口(在Java 8中,您可以在接口中添加默认实现)。