【问题标题】:How can I put the below java query in switch case?如何将以下 java 查询放入 switch case?
【发布时间】:2020-09-18 01:48:26
【问题描述】:

// 如何将下面的 java 查询放入 switch case?我正在使用 spring-mobile 项目,我需要将以下代码放入 switch 帮助中。

try {
    if (device.isMobile()) {
        redirectUri = cfg.getEmail().getVerification().getMobile_success_redirect_url();
    }
} catch (Exception ex) {
    redirectUri = cfg.getEmail().getVerification().getMobile_failure_redirect_url();
    logger.error("Failed to verify email. Cause: {}", ex);
}
try {
    if (device.isTablet()) {
        redirectUri = cfg.getEmail().getVerification().getTablet_success_redirect_url();
    }
} catch (Exception ex) {
    redirectUri = cfg.getEmail().getVerification().getTablet_success_redirect_url();
    logger.error("Failed to verify email. Cause: {}", ex);
}
try {
    if (device.isNormal()) {
        redirectUri = cfg.getEmail().getVerification().getWeb_success_redirect_url();
    }
} catch (Exception ex) {
    redirectUri = cfg.getEmail().getVerification().getWeb_failure_redirect_url();
    logger.error("Failed to verify email. Cause: {}", ex);
}

response.sendRedirect(redirectUri);

【问题讨论】:

  • 看起来不错。为什么要使用开关?
  • 您可以在Device 类中使用枚举属性,而不是所有可以定义为enum DeviceType { MOBILE, TABLET, NORMAL} 的布尔标志,然后为每种类型设置redirectUri 映射可能才有意义。 (即使使用switch)。这意味着一个设备实体只有一种类型的设备是可行的。
  • 在您的代码中,案例不是互斥的,因为即使一个测试成功,其他测试仍会执行,并且它们的子句可能会覆盖已经存在的结果。这不是开关的工作方式。但是如果你真的想要互斥行为,90% 的代码是多余的并且可以被删除,即使没有将if 语句更改为不同的语法结构。但是,有一点不清楚:当异常处理重复刚刚因异常而失败的操作时,它应该如何工作?

标签: java java-8 functional-programming switch-statement


【解决方案1】:

阅读@Naman 的评论。我同意,这里还有一些细节。

我不确定device 类型的类是否在您的控制范围内。

但如果是,您也许应该有表示设备类型的字段,它可以是具有 3 个值 MOBILE, TABLET, NORMAL 的 Enum。

现在您可以在此 Enum 上拥有一个 switch case,每个 case 都包含该特定用例的代码。

此 switch 案例的方法应接受 2 个参数,新创建的 DeviceType 枚举和 cfg.getEmail().getVerification() 返回的 Object。

粗略的大纲,但我希望你明白这一点。

String getRedirectUri(DeviceType deviceType, Verification verification) { switch(deviceType) { case TABLET: case MOBILE: case NORMAL: default } }

【讨论】:

  • 谢谢。我也是这样做的。
  • 附带说明一下,您或许还应该对 cfg.getEmail().getVerification() 进行必要的验证,以免获得 NPE
  • 这些值是从属性文件中挑选出来的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-20
  • 1970-01-01
  • 1970-01-01
  • 2021-07-30
  • 2019-08-18
  • 1970-01-01
相关资源
最近更新 更多