今天,不想聊什么高深莫测的设计模式,也不敢妄称“最佳实践”。
只想结合自己这些年在项目摸爬滚打中踩过的一些坑、积累的一点心得,和大家分享一些关于 return 的、或许能让我们的代码更规范、更优雅、更易读的写法。
权当抛砖引玉,希望能引发大家的一些思考。
在 Java 中,return 语句的优化可以提高代码的可读性、简洁性和性能。以下是一些优化 return 语句的方法:
1. 提前返回 (Early Return)
避免深层嵌套,尽早返回可以简化代码逻辑,这是最常见的、也是最推荐的优化方法,尤其是后期维护时,由于逻辑非常清晰,调试、测试非常方便
优化前:
public static String login(String account, String password){
if(account != null && password != null){
if(!checkAccountExists(account)){
return "账号不存在";
}else{
if(!authenticate(password)){
return "密码错误";
}else{
return "登录成功";
}
}
}else{
return "参数错误";
}
}
优化后:
public static String login(String account, String password){
if(account == null || password == null)
return "参数错误";
if(!checkAccountExists(account))
return "账号不存在";
if(!authenticate(password))
return "密码错误";
return "登录成功";
}
2.避免 return 后的 else
优化前:
if(condition){
...
return;
}else{
...
return;
}
虽然没有逻辑错误,但是给人感觉就比较复杂
优化后:
if(condition){
...
return;
}
...
return;
3.使用三元运算符
对于简单的条件返回,可以使用三元运算符
优化前
public String getStatus(int score) {
if (score >= 60) {
return "Pass";
} else {
return "Fail";
}
}
优化后
public String getStatus(int score) {
return score >= 60 ? "Pass" : "Fail";
}
4.使用 switch 表达式 (Java 14+)
Java 12 引入了 switch 表达式作为预览特性,并在 Java 14 中成为正式特性。switch 表达式是对传统 switch 语句的增强,提供了更简洁的语法和更好的功能性。
优化前
public String getDayType(Day day) {
switch (day) {
case MONDAY:
case TUESDAY:
case WEDNESDAY:
case THURSDAY:
case FRIDAY:
return "Weekday";
case SATURDAY:
case SUNDAY:
return "Weekend";
default:
return "Unknown";
}
}
优化后
public String getDayType(Day day) {
return switch (day) {
case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> "Weekday";
case SATURDAY, SUNDAY -> "Weekend";
default -> "Unknown";
};
}
5.使用 Optional 避免 null 检查
Optional 是 Java 8 引入的一个容器类,用于更优雅地处理可能为 null 的值。
优化前
public String getUserName(User user) {
if (user != null && user.getName() != null) {
return user.getName();
}
return "Unknown";
}
优化后
public String getUserName(User user) {
return Optional.ofNullable(user)
.map(User::getName)
.orElse("Unknown");
}
6.方法链式调用直接返回
链式调用可以使代码更简洁,但应适度使用,避免过度复杂化。
优化前
public List<String> processNames(List<String> names) {
List<String> result = names.stream()
.filter(Objects::nonNull)
.map(String::toUpperCase)
.collect(Collectors.toList());
return result;
}
优化后
return names.stream()
.filter(Objects::nonNull)
.map(String::toUpperCase)
.collect(Collectors.toList());
注意事项
链式调用会使调试更困难,因为不能单独检查每一步的结果
不适合需要检查中间状态或可能抛出异常的方法
在继承体系中需要特别注意返回类型
7.避免不必要的临时变量
如果一个变量仅仅是为了存储即将 return 的值,可以考虑直接 return 表达式的结果。
优化前
public int calculate(int a, int b) {
int result = a * b + 100;
return result;
}
优化后
public int calculate(int a, int b) {
return a * b + 100;
}
8.注意 finally 块中的 return
尽量避免在 finally 块中使用 return,它会覆盖 try 或 catch 块中的 return 或抛出的异常,可能导致非预期的行为和难以追踪的 Bug。
public static int testFinallyReturn() {
try {
return 1;
} finally {
return 2; // 这个返回值会覆盖try块中的返回值
}
}
// 调用结果会是2,不是1
9.返回更有意义的类型(枚举或自定义对象)
优化前
public int processOrder() {
// 返回0成功,1库存不足,2支付失败...
}
优化后 - 使用枚举
public enum ProcessResult {
SUCCESS,
INSUFFICIENT_INVENTORY,
PAYMENT_FAILED,
INVALID_ORDER
}
public ProcessResult processOrder() {
// ...
if (inventory < quantity) {
return ProcessResult.INSUFFICIENT_INVENTORY;
}
return ProcessResult.SUCCESS;
}
// 使用示例
ProcessResult result = orderService.processOrder();
if (result == ProcessResult.SUCCESS) {
// 处理成功
}
结尾
代码写完后,还需要很长的维护时间,优雅、逻辑清晰的代码,会提高工作质量,同时也能避免产生更多的bug。
这些并非什么高深的理论,更多的是在日常写代码时,对可读性、简洁性和健壮性的追求。
希望你能写出诗一样的代码,将代码编程艺术
我是程序员老左,关注我,会发现更多精彩内容