1. 密封类 sealed class(架构约束、防止随意继承)
场景:框架底层基类、枚举扩展、状态机基类,强制限定哪些类可以继承,避免滥用继承破坏设计。
java
// 父类:只允许 OrderPay、OrderRefund 继承
public sealed abstract class OrderState permits OrderPay, OrderRefund {
public abstract String getStateDesc();
}
// 子类必须声明 final / sealed / non-sealed
public final class OrderPay extends OrderState {
@Override
public String getStateDesc() {
return "已支付";
}
}
public final class OrderRefund extends OrderState {
@Override
public String getStateDesc() {
return "已退款";
}
}
2. Record 记录类(替代简单 POJO,不可变数据载体)
场景:DTO、数据库返回实体、接口入参、缓存对象,省去 get/set/toString/equals
java
// 一行搞定不可变实体,自动构造器、get、equals、hashCode、toString
public record UserDTO(Long id, String username, Integer age) {}
// 使用
public static void main(String[] args) {
UserDTO user = new UserDTO(1L, "zhangsan", 25);
System.out.println(user.id());
System.out.println(user.username());
}
3. instanceof 模式匹配(消除强转样板代码)
场景:多类型参数判断、策略分发
java
public static void printObj(Object obj) {
// JDK17:直接在判断时绑定变量,无需强转
if (obj instanceof String s) {
System.out.println("字符串长度:" + s.length());
} else if (obj instanceof Integer num) {
System.out.println("数字平方:" + num * num);
}
}
4. Switch 表达式(转正,替代冗长 if-else)
场景:状态码翻译、枚举映射、业务分支判断
java
public static String getOrderStatus(Integer code) {
return switch (code) {
case 0 -> "待支付";
case 1 -> "已支付";
case 2 -> "已取消";
default -> "未知状态";
};
}
5. 文本块 """ 多行字符串
场景:SQL 语句、JSON、HTML、接口报文,不用转义换行和引号
java
String sql = """
SELECT id, name, create_time
FROM t_user
WHERE status = 1
ORDER BY create_time DESC
LIMIT 10
""";
6.JDK17 整体选型场景
- JDK8 老项目平滑升级,改动最小;
- 需要保留 CMS GC、兼容大量旧依赖反射;
- 只想用上现代 Java 语法,不做架构重构;
- 稳定优先,生态最成熟。