Java简洁代码实践
Java 简洁代码实践
简洁不等于压缩行数。目标是减少重复、明确意图,并避免隐藏副作用。
覆盖当前控制台行
回车符可以把光标移到当前行开头:
代码块收起展开
System.out.printf("\rProgress: %3d%%", percent);
System.out.flush();完成后打印换行。终端并不都支持相同控制行为;日志文件中会保留回车字符,因此正式日志不要用这种进度显示。
条件中赋值
Java 允许在条件表达式中赋值,但可读性往往较差:
代码块收起展开
int count;
if ((count = calculate(parameter)) > 0) {
process(count);
}更推荐分开表达:
代码块收起展开
int count = calculate(parameter);
if (count > 0) {
process(count);
}只有赋值与判断非常紧密且团队习惯明确时才合并。不要把 == 误写成 =;boolean 赋值在条件中能编译但常是缺陷。
提前返回
减少嵌套,让主路径更清楚:
代码块收起展开
Receipt pay(Order order) {
if (order == null) {
throw new IllegalArgumentException("order");
}
if (order.isEmpty()) {
return Receipt.empty();
}
return gateway.charge(order);
}使用标准库表达意图
代码块收起展开
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()));标准库并不总比循环好。需要异常处理、复杂状态或提前终止时,普通循环通常更易读。
避免重复计算与副作用
代码块收起展开
// 不要为了“短”重复昂贵调用
if (loadUser(id) != null) {
send(loadUser(id));
}
// 只计算一次
User user = loadUser(id);
if (user != null) {
send(user);
}var 的边界
var 只用于局部变量,类型必须能从初始化表达式推断。右侧类型明显时可减少噪声:
代码块收起展开
var users = new ArrayList<User>();若类型对理解业务很重要,显式写出更清楚。var 不是动态类型,编译后类型仍固定。
简洁代码检查表
- 名称能否替代注释说明意图?
- 是否减少了嵌套和重复计算?
- 是否隐藏了副作用或异常?
- 一行中是否承担太多职责?
- 标准库写法是否真的比循环更易读?