如何避免 Java 中的 switch-case 语句[重复]

2024-02-22

我有一个 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);
    }

}

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

我想强调的是,这个问题不是重复的this https://stackoverflow.com/questions/14136721/converting-many-if-else-statements-to-a-cleaner-approach。在这种情况下,每种类型只需要一种行为(例如:convertToMp3)。但我的问题指的是我的枚举类型(触发器类型)取决于它可能使用的处理程序,因此每个触发器类型枚举的行为或实现将取决于它所使用的处理程序的要求。


解决方案之一是使用多态性以不同的方式处理触发器。例如,您可以声明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 中,您可以将默认实现直接添加到接口中)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何避免 Java 中的 switch-case 语句[重复] 的相关文章

  • Java 弱哈希映射 - 需要根据值的弱点而不是键来删除条目

    所以JavaWeakHashMap让我们创建一个映射 如果其键变弱 则删除该映射的条目 但是我怎样才能创建一个Map 当它的条目被删除时values地图上变弱了 我想使用映射的原因是作为全局哈希表 它根据对象的 ID 跟踪对象 ID gt
  • 使用 Gson 序列化时如何公开类名

    我的场景非常复杂 但总结如下 我试图了解编译器的源代码 并了解每个 AST 节点代表什么 我正在生成不同程序的 AST 的 JSON 序列化 然后检查可视化的 JSON 输出 它工作得很好 除了一个问题是在 Gson 中生成的 JSON 数
  • 枚举 NSString 的最佳方法

    我正在寻找枚举 objc 对象 例如 NSString 的方法 我记得 Xcode4 版本中有一个新功能 它提供了一种新的 enum 方法 但不清楚 有人知道吗 好吧 我自己回答 我想我犯了一个错误 这就是我上面提到的新功能 typedef
  • 按对象值分组,统计后按最大对象属性设置组键

    我设法使用 Java 8 Streams API 编写了一个解决方案 该解决方案首先按对象 Route 的值对列表进行分组 然后计算每组中的对象数量 它返回一个映射 Route gt Long 这是代码 Map
  • Selenium - 保存网站,包括所有图像、css、dom

    我想使用 firefox 或 chrome 访问带有 selenium 的页面 当页面加载时 我想从页面下载所有图像 css dom 我想存储每张图像 就像我在其中找到它们一样 chrome gt Tools gt Development
  • 如何使用 Spring Security 跨多个基于 JVM 的应用程序实现单点登录

    我目前正在尝试跨多个基于 JVM Grails Servlet 的 Web 应用程序实现单点登录解决方案 这些应用程序目前都部署在同一个 servlet 容器 当前是 Tomcat 但不想将我的解决方案仅限于 Tomcat 中 所有 Web
  • @NotNull.List 的目的

    当我查看标准时限制条件 http docs oracle com javaee 6 api javax validation constraints package summary html在 Bean Validation API JSR
  • 可以向 @ManyToMany Hibernate 额外表添加额外字段吗?

    我有这两类 表 Entity Table name course public class Course Id Column name courseid private String courseId Column name coursen
  • PrintStream是有缓冲的,但是flush不会降低性能,而BufferedOutputStream会加速性能

    我预计由于 PrintStream 是缓冲的 通过在每次 print 之后添加刷新操作 速度性能应该会显着降低 但事实并非如此 如下面的代码片段所示 此外 将 PrintStream 包裹在 BufferedOutputStream 周围可
  • Java 中的本机方法

    我花了一些时间学习什么是 Java Native 方法以及它们是在平台相关代码 主要是 C 中实现的 但是我在哪里可以找到这些 Java 的本机实现呢 例如 Thread 类的 sleep long millis 方法是本机的 但它的实现代
  • “TryParse / Parse like”模式:实现它的最佳方法是什么

    这个问题是来自的后续问题如何指示方法不成功 https stackoverflow com questions 161822 how to indicate that a method was unsuccessful xxx Tryxxx
  • 将 emoji 替换为适当的 java 代码

    我正在开发一个简单的java程序 它可以接受这样的字符串 停止 你违反了 法律 但是现在 你 并将每个表情符号替换为适当的 java 字符 我不知道该怎么称呼他们 这是一个例子 汽车表情符号 将替换为 uD83D uDE97 这允许我有一个
  • Java 泛型和数字类型

    我想创建一个通用方法来有效地执行此操作 class MyClass static
  • 如何将 wsdl 内部架构设置为 Jaxb2Marshaller 以验证我所做的每篇文章?

    我正在使用 SOAP Web 服务 在调用它之前我必须验证每个 xml 帖子 所以我正在使用 The CXF codegen 插件生成POJO树结构 第三部分 wsdl xxxx soap service wsdl 一个类实现Web服务网关
  • Keycloak 社交登录 REST API

    我已经为我的 keycloak 实例启用了谷歌社交登录 但我需要将其用作休息服务 是否有可用于执行此操作的端点 Keycloak 中没有 Google 身份验证 API 但您可以使用以下方法解决它代币交换 https www keycloa
  • Java 中意外的负数

    import java util public class Prac9FibonacciNumbers public static void main String args int x new int 100 x 0 1 x 1 1 fo
  • 在 Java 中打开现有文件并关闭它。

    是否可以在java中打开一个文件附加数据并关闭多次 例如 psuedocode class variable declaration FileWriter writer1 new FileWriter filename fn1 writer
  • 获取证书链

    我正在 Java 中使用 X509 证书 给定一个证书 是否可以在签名层次结构中找到所有其他证书 直到找到根证书 我有一个证书文件 带有 cer扩展名 我想提取父签名证书 我想继续查找该证书的父证书 直到获得最终的自签名根证书 我已经检查了
  • 有时 Properties.load() 会跳过行

    在以下情况下 Properties load 会跳过 InputStream 的第二行 这是 Java 的错误还是正常行为 public class PropTest public static void main String args
  • 如果所有类不在同一个包中,Spring @autowired 不起作用

    我有四个包裹 com spring org Files HomeController java com spring org dao Files SubscriberDao java SubscriberDaoImpl java com s

随机推荐

  • 如何在 SSIS 中设置 zip 文件的密码?

    我使用 SSIS 中的执行进程任务通过 7 zip 压缩了文件 现在我必须为 zip 文件设置密码 我该如何实现 我不认为这是一个 ssis 问题 你必须看看7zip 命令行用户指南 https sevenzip osdn jp chm c
  • 我如何告诉 Struts2 在表单第一次显示时不要验证表单?

    我目前正在尝试学习Struts2 我创建了一个表单 一个处理表单的操作 一个验证表单的 XML 以及 struts xml 中的操作 每次显示表单时 即使是第一次 Struts2 都会尝试进行验证 因此在用户有机会完成表单之前就会显示错误
  • Chai 无法识别内容类型“application/javascript”

    无论我的服务器实际返回什么 Chai 总是给我res body 如果内容类型是 application javascript 这是我的服务器 const http require http const server http createS
  • 在 Go 中将 unicode 代码点转换为文字字符

    假设我有一个这样的文本文件 u0053 u0075 u006E 有什么方法可以将其转换为这个吗 S u n 目前 我正在使用ioutil ReadFile data txt 但是当我打印数据时 我得到的是 unicode 代码点而不是字符串
  • WSO2 身份服务器外部 LDAP 因 OID 身份人员不存在而抛出 OBJECT_CLASS

    我正在使用 Identity Server 4 1 0 并且还在 Apache Directory Studio 中运行 ApacheDS 所以我现在想要的是将我的 IS 连接到外部 LDAP IS 与 ldap 的连接良好 只是由于缺少属
  • 多个事件的 Gmail 标记

    我正在使用 json ld 开发事件标记 以包含在确认电子邮件中 我的一些事件会定期重复发生 但是 最新的 Schema org 规范不支持重复事件 因此我遵循了此处提供的建议 http lists w3 org Archives Publ
  • ORACLE/ASP.NET:ORA-2020 - 数据库链接太多......是什么原因造成的?

    这是场景 我们有一个运行最新版本 ODAC Oracle 客户端 的内部网站 它打开数据库连接 运行存储过程或打包方法 然后断开连接 连接池已打开 目前我们的开发和测试环境均处于 11g 版本 但生产环境处于 10gR2 版本 这种情况发生
  • 从 IE 中 HtmlElement 的 Dom 获取 IHTMLStyle3

    我在窗体上有一个 System Windows Form WebBrowser 控件 我将该浏览器对象导航到一个网址 页面加载完成后 我想分析加载的页面的各个方面 我特别感兴趣的是在 IHTMLStyle3 接口上找到的属性 writing
  • Selenium WebDriver C# 使用 ChromeDriver 和 FirefoxDriver 的完整网站屏幕截图

    当我使用 ChromeDriver 截取屏幕截图时 我会得到与我的视口大小相同的屏幕 当我使用 FirefoxDriver 截取屏幕截图时 我得到了我想要的 即网站的全屏打印 ChromeDriver 声明如下 IWebDriver dri
  • 如何将 .NET Compact Framework 添加到智能设备 CAB 项目中?

    我正在开发一个 VS2008 智能设备应用程序 其中包含用于部署的智能设备 CAB 项目 我惊讶地发现此安装程序项目在必要时不会安装 NET Compact Framework 可以这样做吗 这可以通过一些工作来完成 看自动将多个 CAB
  • 如何使用 jquery 清除文本区域

    这个问题已经得到解答 但为了将来的参考 这里有一个完整的例子 您可以根据需要多次单击 添加 按钮和 清除 按钮 它就会起作用 但是 一旦您在文本框中输入内容 清除和添加按钮就不起作用
  • 正确使用电子

    我想进入 Electron 并且我已经开始学习它 但是我认为我不太明白应该如何使用它 根据我收集的信息 使用 Electron 我能够创建跨桌面应用程序 铬 with HTML CSS 和 JavaScript并在后台执行任务 NodeJS
  • 返回 void* 的 C++/C 函数指针

    我正在尝试调用一个带有参数的函数 void void int const char 但我不知道如何将这些参数传递给函数 Example void ptr int int function int int void int 我试图像这样调用该
  • 如何在 CodeIgniter 中检查请求是否是通过 AJAX 发出的?

    如何检查请求是否是 AJAX 我正在使用 CodeIgniter 我有一个链接 当它单击时 它将打开弹出对话框窗口 这是通过 ajax 请求控制器名称来完成的login window 代码点火器 Here is the controller
  • pip 未能为 scipy 构建轮子

    我刚刚下载了新的python 3 8我正在尝试安装scipy使用以下内容进行封装 pip3 8 install scipy 但是构建失败并出现以下错误 Failed to build scipy ERROR Could not build
  • 如何重构这个?

    我试图重构这个 class AClass string Property1 get set string Property2 get set string Property3 get set void AMethod AClass othe
  • symfony2主义选择IFNULL

    好的 我有这个代码 SELECT IFNULL s2 id s1 id AS effectiveID IFNULL s2 status s1 status AS effectiveStatus IFNULL s2 user id s1 us
  • dplyr: case_when 涉及很多情况

    我有两个数据框 set seed 002 data1 lt data frame cbind a1 sample letters 8 replace TRUE a2 rpois 8 10 stringsAsFactors FALSE dat
  • 复选框已全部单击

    我想在单击任何子项时选择父项 这段代码正在检查和检查 function child on click function parent this prevAll parent if this is checked parent prop ch
  • 如何避免 Java 中的 switch-case 语句[重复]

    这个问题在这里已经有答案了 我有一个 TriggerType 枚举 可以在其中添加不同的触发器 public enum TriggerType meta data list toggle 这些触发器类型在不同的处理程序 例如组件 仪表板等