java - 如何避免 Java 中的 switch-case 语句

标签 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)。但我的问题指的是我的枚举类型(触发器类型)依赖于它可能被使用的处理程序,因此每个触发器类型枚举的行为或实现将取决于它正在使用的处理程序的要求。

最佳答案

解决方案之一是使用多态性以不同方式处理触发器。例如,您可以声明 Trigger 接口(interface)并有多个实现。在这种情况下,当你需要一个新的触发器类型时,你只需要实现这个接口(interface),不要触及现有的代码:

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);
}

在这种情况下,不可能添加新的触发器类型而不实现其行为。

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

关于java - 如何避免 Java 中的 switch-case 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39051356/

相关文章:

java - JSON解析错误:无法构造`com.tess4j.rest.model.Image`的实例(尽管至少存在一个Creator):

java - void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' 在空对象引用上

java - 是否有可能开发一个完全存在于 JVM 中的操作系统?

java - 从复杂的 JSON 数据创建 Hashmap

oop - 命令模式如何参数化具有不同请求的客户端?

asp.net - 从 Global.Asax Application_Startup 调用 ThreadPool.QueueUserWorkItem

php - Laravel 使用外墙有什么缺点吗?

java - 将 Class.getEnumConstants 转换为字符串

PHP + SQL 查询 : Selecting Enum Values

ios - 为什么delegate.respondsToSelector(Selector ("testEnum:"))这段代码用swift语言会返回false?