对于从 public static void main(String[] args) 和 System.out.println() 开始 Java 生涯的开发者来说,Java 的演进从未停止。日常业务代码中充斥着 CRUD、DTO、Service 等重复劳动,常让人感叹 Java 是否过于笨重。但真相是,问题往往在于我们是否采用了最新的编程实践。
从 Java 8 到如今的 Java 21/25,语言特性不断升级,写法愈发简洁。下面分享几个在真实项目中验证过的高效技巧,帮助你提升代码质量与开发效率。
① 枚举(Enum)作为轻量策略类,替代复杂条件逻辑
枚举不应仅限于表示简单常量,它本质是自带多态的轻量级策略类。以会员等级折扣为例,相比传统的 if-else 或 switch 语句,将业务逻辑封装在枚举中更符合开闭原则。
public enum MemberType {
REGULAR {
@Override
public double applyDiscount(double price) {
return price * 0.98;
}
},
VIP {
@Override
public double applyDiscount(double price) {
return price * 0.9;
}
},
PREMIUM {
@Override
public double applyDiscount(double price) {
return price * 0.8;
}
};
public abstract double applyDiscount(double price);
}
使用时代码清晰简洁:
double finalPrice = MemberType.VIP.applyDiscount(100);
这种方式消除了条件分支,新增业务类型只需添加枚举值,维护性显著提升。
② 使用 Record 简化 DTO,减少模板代码
过去创建 DTO 需要手动编写字段、getter、equals、hashCode 和 toString 方法,或依赖 Lombok。Java 14 引入的 Record 类能极大简化这一过程。
public record UserProfile(String username, String email) {}
Record 自动生成不可变字段、访问器及常用方法,使用直观:
UserProfile user = new UserProfile("dev_user", "user@example.com");
System.out.println(user.username());
System.out.println(user);

③ 为ID创建专属类型,提升编译期安全性
当方法参数同为 Long 类型时,易因顺序错误导致逻辑bug:
void process(Long userId, Long orderId) {
// 若误传 process(orderId, userId),编译通过但运行错误
}
通过定义具体类型,让编译器在早期拦截错误:
public record UserId(long value) {}
public record OrderId(long value) {}
void process(UserId userId, OrderId orderId) {}
现在传递错误类型将直接编译失败,将运行时问题提前暴露。
④ 利用 Stream API 声明式表达业务意图
处理集合数据时,Stream API 允许以声明式方式描述操作,避免冗长的循环与临时变量。例如,从产品列表中筛选价格高于500并提取名称:
List<String> result = products.stream()
.filter(p -> p.price() > 500)
.map(Product::name)
.toList();
代码直接体现业务逻辑“筛选-映射-收集”,支持并行处理,可读性与组合性更强。

⑤ 文本块(Text Block)优化多行字符串书写
在 Java 中嵌入 JSON、SQL 或 HTML 时,传统字符串拼接繁琐且易错。文本块特性(Java 13+)提供更清晰的写法。
旧方式:
String json = "{\n" +
" \"name\": \"Alice\",\n" +
" \"age\": 30\n" +
"}";
新方式:
String json = """
{
"name": "Alice",
"age": 30
}
""";
格式直观,无需转义符,大幅提升可读性。
⑥ Optional 明确表达可能缺失的值
Optional 的核心价值在于强制调用方处理空值场景,而非简单替代 null。它通过语义约束减少 NullPointerException 风险。
repository.findUserNameById(id)
.ifPresentOrElse(
name -> System.out.println("找到用户:" + name),
() -> System.out.println("用户不存在")
);
这种方式链式表达业务分支,促使开发者显式处理值不存在的情况。
⑦ 灵活管理多版本 JDK 环境
实践中,项目可能需切换不同 Java 版本(如 Java 8 用于旧系统,Java 17/21 用于新项目)。手动管理环境变量效率低下。推荐使用版本管理工具(如 ServBay),实现多版本 JDK 的隔离与快速切换,让开发者聚焦于代码与新特性实践。

总结
Java 语言持续进化,关键在于更新编程思维。通过枚举替代条件分支、Record 简化数据载体、类型化 ID 增强安全性、Stream 声明式处理数据、文本块改善字符串操作,以及 Optional 明确空值语义,可以显著提升代码的简洁性、可读性与健壮性。拥抱这些现代特性,你会发现 Java 依旧是一门优雅且高效的语言。
