Java简洁代码实践

Java 简洁代码实践

简洁不等于压缩行数。目标是减少重复、明确意图,并避免隐藏副作用。

覆盖当前控制台行

回车符可以把光标移到当前行开头:

代码块JAVA · 2 行收起展开
System.out.printf("\rProgress: %3d%%", percent);
System.out.flush();

完成后打印换行。终端并不都支持相同控制行为;日志文件中会保留回车字符,因此正式日志不要用这种进度显示。

条件中赋值

Java 允许在条件表达式中赋值,但可读性往往较差:

代码块JAVA · 4 行收起展开
int count;
if ((count = calculate(parameter)) > 0) {
    process(count);
}

更推荐分开表达:

代码块JAVA · 4 行收起展开
int count = calculate(parameter);
if (count > 0) {
    process(count);
}

只有赋值与判断非常紧密且团队习惯明确时才合并。不要把 == 误写成 =;boolean 赋值在条件中能编译但常是缺陷。

提前返回

减少嵌套,让主路径更清楚:

代码块JAVA · 9 行收起展开
Receipt pay(Order order) {
    if (order == null) {
        throw new IllegalArgumentException("order");
    }
    if (order.isEmpty()) {
        return Receipt.empty();
    }
    return gateway.charge(order);
}

使用标准库表达意图

代码块JAVA · 4 行收起展开
String displayName = Objects.requireNonNullElse(name, "Anonymous");
boolean valid = values.stream().allMatch(this::isValid);
Map<String, User> byId = users.stream()
        .collect(Collectors.toMap(User::id, Function.identity()));

标准库并不总比循环好。需要异常处理、复杂状态或提前终止时,普通循环通常更易读。

避免重复计算与副作用

代码块JAVA · 10 行收起展开
// 不要为了“短”重复昂贵调用
if (loadUser(id) != null) {
    send(loadUser(id));
}

// 只计算一次
User user = loadUser(id);
if (user != null) {
    send(user);
}

var 的边界

var 只用于局部变量,类型必须能从初始化表达式推断。右侧类型明显时可减少噪声:

代码块JAVA · 1 行收起展开
var users = new ArrayList<User>();

若类型对理解业务很重要,显式写出更清楚。var 不是动态类型,编译后类型仍固定。

简洁代码检查表

  • 名称能否替代注释说明意图?
  • 是否减少了嵌套和重复计算?
  • 是否隐藏了副作用或异常?
  • 一行中是否承担太多职责?
  • 标准库写法是否真的比循环更易读?

延伸阅读