你真的会用 return 吗?—— 9个值得推荐的 return 优化技巧

今天,不想聊什么高深莫测的设计模式,也不敢妄称“最佳实践”。

只想结合自己这些年在项目摸爬滚打中踩过的一些坑、积累的一点心得,和大家分享一些关于 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。

这些并非什么高深的理论,更多的是在日常写代码时,对可读性、简洁性和健壮性的追求。

希望你能写出诗一样的代码,将代码编程艺术

我是程序员老左,关注我,会发现更多精彩内容

原文链接:,转发请注明来源!