JDK12 新特性 switch expressions (预览)

switch expressions 这个新特性蛮有意思的,在部分情况下能减少我们的代码量,尤其在工厂模式下,会很简单

例如,一个支付服务,我们通常的实现如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Service
public interface PayService {
Result pay();
}
@Service
public class AliService implements PayService {
@Override
public Result pay() {
return Result.of("success", "Paying by Ali!");
}
}
@Service
public class WechatService implements PayService {
@Override
public Result pay() {
return Result.of("success", "Paying by Wechat!");
}
}

抽象出支付对象,同时有多个实现,如果我们需要通过编号获取对应的支付服务实现,可以通过以下工厂获取

1
2
3
4
5
6
7
public PayService get(String no) {
switch (no) {
case "wechat": return wechatService;
case "ali": return aliService;
default: return null;
}
}

改编成switch expressions,语法上会更简单,将会像下面一样

1
2
3
4
5
6
7
public PayService get(String no) {
return switch (no) {
case "wechat" -> wechatService;
case "ali" -> aliService;
default -> null;
};
}

如果使用完整的代码块写的话,需要像下面那样编写

1
2
3
4
5
6
7
8
9
public PayService get(String no) {
return switch (no) {
case "wechat" -> wechatService;
case "ali" -> {
break aliService;
}
default -> null;
};
}

加括号和break后返回值,预览的特性不是很稳定,上面的写法是jdk12,在jdk13中JEP 354取代JEP 325,对这部分进行的修改,添加了yield关键字进行返回,同时要求你使用switch expressions时,必须穷尽所有情况返回预期值以及不能有跳出switch的操作(return、continue等等)

1
2
3
4
5
6
7
8
9
10
public PayService get(String no) {
return switch (no) {
case "wechat" -> wechatService;
case "ali" -> {
yield aliService;
}
default:
yield null;
};
}

毕竟是预览特性,十分不稳定,就目前来看,添加关键字为了一点点的简写,有点得不偿失吧

Example Source