如何正确实现此 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;
}
我想生成一个字符串,它是一个字母(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;
}