java定义常量需用public static final确保类级共享与不可变,命名全大写加下划线;状态值优先用枚举增强类型安全;集合类须用collections.unmodifiablemap等双重防护;非业务语义数字无需硬编码为常量。

Java 中定义常量,核心是用 final 关键字确保值不可变,再结合 static 实现类级共享,配合规范命名和合理位置,让代码更清晰、安全、易维护。
用 public static final 定义最常用常量
这是业务代码中最主流的做法。它让常量属于类本身,无需实例即可访问,且编译期确定、不可修改。
- 声明格式:public static final 数据类型 常量名 = 值;
- 命名必须全大写、单词间用下划线分隔,例如 MAX_RETRY_COUNT、DEFAULT_TIMEOUT_MS
- 建议放在相关类中(如工具类、配置类),不要散落在方法里;同时配 Javadoc 注释用途,比如:
/** HTTP 连接超时,默认 5 秒 */
public static final int DEFAULT_CONNECT_TIMEOUT_MS = 5000;
状态类数值优先用枚举
当数字代表固定语义的状态(如订单状态、响应码类型),枚举比整型常量更可靠、更自解释。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 枚举天然防止传入非法值,编译期就能拦截错误
- 每个枚举项可自带属性和方法,例如:
public enum HttpStatus {
OK(200), NOT_FOUND(404), SERVER_ERROR(500);
private final int code;
HttpStatus(int code) { this.code = code; }
public int getCode() { return code; }
} - 调用时直接写 HttpStatus.OK,语义明确,不依赖记忆数字含义
集合类常量要“双重防护”
像 Map、List 这类引用类型,仅用 static final 只能锁住引用地址,内容仍可修改。必须额外封装为不可变视图。
- 推荐写法:用 Collections.unmodifiableMap() 包装初始化后的 Map
- 示例:
public static final MapHEADERS = Collections.unmodifiableMap(
new HashMap() {{ put("Content-Type", "application/json"); }}); - 也可用 Map.of()(Java 9+)或 Map.copyOf()(Java 10+)创建不可变实例,更简洁安全
哪些数字不用硬套常量
不是所有数字都适合提成常量,滥用反而干扰阅读。
- 循环索引(i = 0)、数组长度(arr.length)、数学系数(* 2、/ 1000)等通用表达,加简单注释更自然
- 测试中的断言值(assertEquals(42, result)),上下文已说明意图,无需额外定义
- 字符串长度限制等业务规则若可能变化,更适合放配置文件或 @ConfigurationProperties 类中,而非硬编码常量
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










