Java中定义常量须用public static final组合,确保不可变且类级共享;命名严格采用全大写加下划线(如MAX_RETRY);static final在类加载时初始化,而仅final的实例变量需在每个构造器中赋值。

Java 中用 final 关键字定义常量,表示该变量一旦赋值就不能再修改;命名上约定使用全大写字母、单词间用下划线分隔(即 UPPER_CASE)。
用 final 定义常量的基本写法
final 修饰的变量必须在声明时或构造过程中完成初始化,之后不可重新赋值。
- 基本类型常量:直接在声明时赋值
- 引用类型常量:final 保证的是引用地址不变,但对象内部状态仍可变(如 final List 可 add 元素)
- 类成员常量建议加 static,避免每个实例都存一份
示例:
public class Config {
public static final int MAX_RETRY = 3; // 静态常量,推荐
public final String APP_NAME = "MyApp"; // 实例常量(不常用)
private static final List<String> SUPPORTED_LOCALES; // 声明不赋值,需在静态块中初始化
static {
SUPPORTED_LOCALES = new ArrayList<>();
SUPPORTED_LOCALES.add("zh-CN");
SUPPORTED_LOCALES.add("en-US");
}
}
常量命名规范(必须遵守)
Java 社区广泛采用全大写 + 下划线风格,清晰表明其不可变性,也便于 IDE 和工具识别。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
- 所有字母大写,单词之间用单个下划线连接:例如 DATABASE_URL、DEFAULT_TIMEOUT_MS
- 避免数字开头、不使用驼峰(如 maxRetry 不合法)、不混用大小写(如 Max_Retry 不规范)
- 布尔常量通常用 IS_ 或 HAS_ 开头:IS_DEBUG_ENABLED、HAS_CACHE
static final 和 final 的区别要点
是否加 static 直接影响常量的作用域和内存行为:
- static final:属于类,全局唯一,推荐用于配置、枚举值、数学常量等
- final(无 static):属于实例,每个对象一份副本,仅在构造器中初始化一次,适用于依赖对象状态的固定值(较少见)
- 接口中定义的字段默认是 public static final,可省略这三个修饰符
接口示例:
public interface HttpStatus {
int OK = 200; // 等价于 public static final int OK = 200;
int NOT_FOUND = 404;
}
常见误区与注意事项
final 不等于“完全不可变”,尤其对引用类型要特别小心:
- final List 或 final Map 只禁止重新指向新集合,但 add/remove/clear 等操作仍合法
- 如需真正不可变集合,应使用 Collections.unmodifiableList() 或 Java 10+ 的 List.of()
- 不要在构造器中将 this 引用泄露给其他对象,否则 final 字段可能被外部提前读取(导致未完全初始化)
- 编译时常量(如 static final int X = 5)会被内联优化;若值来自方法调用(如 static final long TS = System.currentTimeMillis()),则不会内联

















