如何正确实现此 switch 语句来组成字符串?

How do I correctly implement this switch statement to compose a string?

我想生成一个字符串,它是一个字母(A、B 或 C),后跟两个随机数。我写了下面的代码:

enum ReportType {CHILD, ELDER, BOOMER};


    public String setNumber(Report.ReportType type) {

        Random rand = new Random();

        String number = String.valueOf(rand.nextInt(10)) + String.valueOf((rand.nextInt(10)));
               
              
        switch (type) {
            case CHILD:
                String prefix = "A";
                break;
            case ELDER:
                prefix = "B";
                break;
            case BOOMER:
                prefix = "C";
                break;
    

                 accountNumber = prefix + number;

        }
        return accountNumber;
    }

当我 运行 代码时,我只得到两个随机数,没有前缀。我不清楚错误在哪里,但我猜我的 switch 语句有问题。

您需要将行 accoutNumber = prefix + number; 移到 switch 语句之外。

语句accountNumber = number + prefix 永远不会是reached/executed。当这种情况发生时,前缀被设置,然后 break 语句使程序跳到下一行,就在关闭开关大括号之后。你需要把它放在 de switch 块之外,所以,在决定设置哪个前缀之后,语句总是被执行。

Java 12人介绍switch expressions:

String prefix = switch (type) {
  case CHILD -> "A";
  case ELDER -> "B";
  case BOOMER -> "C";
};
String accountNumber = prefix + number;

这样做的好处是编译器会进行检查以确保您涵盖了所有情况。

对于 Java 12 之前的版本,我会使用一种方法 (*):

String getPrefix(Type type) {
  switch (type) {
    case CHILD: return "A";
    case ELDER: return "B";
    case BOOMER: return "C";
  }
  throw new AssertionError("Switch not exhaustive!");
}

然后:

String accountNumber = getPrefix(type) + number;

当然,如果你能控制枚举,你可以在枚举中添加一个方法:

enum Type {
  CHILD("A"), ELDER("B"), BOOMER("C");

  private String prefix;

  Type(String prefix) {
    this.prefix = prefix;
  }

  String getPrefix() { return prefix; }
}

然后像这样使用它:

String accountNumber = type.getPrefix() + number;

(*) 我这样写而不是默认的,因为我习惯使用 带有 ErrorProne's MissingCasesInEnumSwitch check 的编译器 - 当没有默认值时,会检查 switch 是否详尽无遗。

此处显示了即时修复。但更好的解决方案显示在 .

  • 我们通过声明 outside 你的 switch 而不是 inside 来扩展 prefix 的范围。
  • 我们将 accountNumber 作业移动到 switch 下方 而不是 内部 。在旧位置,该行代码从未到达。 break 命令将控制流移过整个 switch.
  • 我们将 accountNumber 声明为 String
    enum ReportType {CHILD, ELDER, BOOMER};

    public String setNumber(Report.ReportType type) {
        Random rand = new Random();
        String number = String.valueOf(rand.nextInt(10)) + String.valueOf((rand.nextInt(10)));
               
        String prefix = "" ;   // Declare `prefix` here…
        switch (type) {
            case CHILD:
                prefix = "A";  // … not here.
                break;
            case ELDER:
                prefix = "B";
                break;
            case BOOMER:
                prefix = "C";
                break;
        }
        String accountNumber = prefix + number; // Declare and build `accountNumber here, not in the unreachable place within `switch` after last `break`.
    
        return accountNumber;
    }