Java编码进化:5个被低估的现代技巧
导语
Java语言在不断发展,许多传统写法已被现代特性取代。本文分享5个提升代码质量和开发效率的现代编码技巧,涵盖记录类、模式匹配、文本块等特性,附可直接替代的代码模板,帮助您编写更简洁、更安全的Java应用。
一、记录类替代传统DTO
场景:数据传输对象的繁琐定义
传统方式:
public class UserDTO {
private final String name;
private final int age;
public UserDTO(String name, int age) {
this.name = name;
this.age = age;
}
// 6个额外方法(getter/equals/hashCode/toString)
}
现代方案:
public record UserDTO(String name, int age) {
// 自动生成所有方法
// 可添加紧凑构造器
public UserDTO {
if (age < 0) throw new IllegalArgumentException("年龄无效");
}
}
优势对比:
| 指标 | 传统类 | 记录类 | 改进 |
|---------------|--------|--------|---------|
| 代码行数 | 42 | 5 | 88%↓ |
| 可维护性 | 低 | 高 | ★★★★☆ |
| 线程安全性 | 手动 | 自动 | 100% |
二、模式匹配简化类型判断
场景:复杂的类型检查和转换
传统方式:
if (obj instanceof String) {
String s = (String) obj;
System.out.println(s.toUpperCase());
} else if (obj instanceof Integer) {
int i = (Integer) obj;
System.out.println(i * 2);
}
现代方案:
switch (obj) {
case String s -> System.out.println(s.toUpperCase());
case Integer i -> System.out.println(i * 2);
case null, default -> System.out.println("未知类型");
}
适用场景:
- 处理异构集合
- 解析网络协议
- 实现访问者模式
三、文本块处理多行内容
场景:在代码中嵌入SQL/JSON/HTML
传统方式:
String html = "<html>\n" +
" <body>\n" +
" <h1>标题</h1>\n" +
" </body>\n" +
"</html>";
现代方案:
String html = """
<html>
<body>
<h1>标题</h1>
</body>
</html>
""";
// SQL示例
String query = """
SELECT id, name, email
FROM users
WHERE status = 'ACTIVE'
""";
核心优势:
- 保持原始缩进格式
- 自动处理换行符
- 减少转义字符使用
四、增强的Null安全处理
场景:避免多层嵌套的null检查
传统方式:
if (user != null) {
Address address = user.getAddress();
if (address != null) {
String city = address.getCity();
if (city != null) {
System.out.println(city.toUpperCase());
}
}
}
现代方案:
Optional.ofNullable(user)
.map(User::getAddress)
.map(Address::getCity)
.ifPresent(city ->
System.out.println(city.toUpperCase())
);
安全扩展:
// 自定义安全导航
public static <T, R> R safeGet(T obj, Function<T, R> func, R defaultValue) {
return obj != null ? func.apply(obj) : defaultValue;
}
// 使用示例
String city = safeGet(user, User::getAddress, Address.EMPTY)
.getCity();
五、集合工厂方法简化
场景:快速创建不可变集合
传统方式:
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
list = Collections.unmodifiableList(list);
现代方案:
List<String> list = List.of("A", "B", "C");
Set<Integer> set = Set.of(1, 2, 3);
Map<String, Integer> map = Map.of("key1", 1, "key2", 2);
// 超过10个元素的Map
Map<String, Integer> largeMap = Map.ofEntries(
Map.entry("key1", 1),
Map.entry("key2", 2),
// ...
Map.entry("key20", 20)
);
不可变集合优势:
- 线程安全
- 防止意外修改
- 优化内存使用