【问题标题】:Simplify a switch statement to avoid code duplication简化 switch 语句以避免代码重复
【发布时间】:2022-06-14 12:16:20
【问题描述】:

我有以下代码:

String fullName = "";
switch(name) {
  case "name1":
    fullName = String.format("%s %s", name, "surname1");
    break;

  case "name2":
    fullName = String.format("%s %s", name, "surname2");    
    break;

  case "name3":
    fullName = String.format("%s %s", name, "surname3");
    break;
  ...
}

(case后面有个break语句,我这里没写)

那么问题来了:

除了String.format() 的参数外,共有 16 种不同的 case 语句具有完全相同的代码。

有什么办法可以简化这段代码?


注意:Java 8 是必须的

【问题讨论】:

  • 使用Map<String, String> 来查找格式字符串? (不幸的是,很难判断这是否仅适用于伪代码。我们不需要查看 实际 业务代码,但您应该能够想出一个 minimal reproducible example 来演示问题。)
  • 你的意思是 作为键和 arg 格式化为值?
  • @justanotherguy 你需要展示你的格式化字符串参数是什么样子的。
  • 用你的具体例子,你可以有一个Map<String, String>,其中的键是“name1”->“surname1”、“name2”->“surname2”和“name3”->“surname3 ”。但是差异真的只是常数吗?
  • @justanotherguy:这并不能真正告诉我它是否适合出现在地图中......听起来你所展示的仍然不是实际上代表你需要什么。

标签: java java-8 switch-statement


【解决方案1】:

好吧,如果您的所有案例都具有这种确切的形式,那么您可以简单地执行以下操作:

String surname;
switch (name) {
    case "name1":
        surname = "surname1";
        break;
    case "name2":
        surname = "surname2";
        break;
    default:
        surname = "";
        break;
}
String fullname = String.format("%s %s", name, surname);

或者使用Map 来查找值:

Map<String, String> mapping = new HashMap<>();
mapping.put("name1", "surname1");
mapping.put("name2", "surname2");
mapping.put("name3", "surname3");

String surname = mapping.get(name); // Assuming name is always a valid map entry
String fullname = String.format("%s %s", name, surname);

【讨论】:

  • 附带说明,这样使用String.format(…) 就像使用飞机去超市一样。没有理由不使用直截了当的name + " " + surname
  • @Holger,我知道,但我公司的代码质量标准很奇怪。使用格式和/或字符串构建器是必须的,因此必须使每个该死的 varialbe(甚至是本地的)最终!
  • @justanotherguy 想知道他们是否对此规则有解释。这很可能是模糊的或完全错误的。
  • @justanotherguy 我认为你提到的例子是简化的,所以我原样离开了String.format(…)。事实证明不是,而是因为您公司的代码样式标准。这让我和 Holger 一样好奇为什么
  • @MCEmperor,还有一个更大的问题……为什么是 java 8 而不是 11?!
【解决方案2】:

其他地方概述的 Map 方法可能是 Java 8 的最佳选择,但请注意,从 Java 14 开始,您可以使用 switch 表达式:

String surname = switch (name) { 
    case "name1" -> "surname1";
    case "name2" -> "surname2";
    ...
};
String fullName = String.format("%s %s", name, surname);
 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多