java中通过public static final定义常量类实现“全局常量”效果:三要素缺一不可,基本类型值锁定,引用类型需用不可变对象;命名全大写下划线,初始化在声明处或static块;按业务域拆分常量类并加私有构造器;统一用“类名.常量名”访问。

Java 中没有真正意义上的“全局常量”,但通过规范定义常量类,可以实现跨模块安全、清晰、易维护的常量访问效果。关键不在于能不能“全局”,而在于怎么组织才不容易出错、便于协作和演进。
必须用 public static final 三要素齐备
缺一不可:public 提供跨包访问能力,static 确保单例共享(类加载时初始化一次),final 锁定值不可变。三者共同构成 Java 语义上最接近“全局常量”的标准形式。
- 基本类型(如 int、boolean):值直接锁定,不可更改
- 引用类型(如 String、List):final 只锁住引用地址,内容仍可能被修改——因此推荐使用不可变对象,例如 String、Integer、List.of() 或 ImmutableList
- 禁止仅用 final(每个实例一份副本)、仅用 static(值可被意外修改)、仅用 public(包外无法访问)
命名与初始化要严格遵循约定
命名不是风格问题,而是工程契约。IDE 和静态检查工具(如 Checkstyle、SonarQube)默认按此规则校验,不遵守会触发警告甚至阻断构建。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 全大写 + 下划线分隔:✅ API_TIMEOUT_MS、DEFAULT_PAGE_SIZE;❌ apiTimeoutMs、MaxRetry、max_retry
- 初始化必须在声明处或静态代码块中完成:字面量直赋最安全;若需读配置(如从 properties 文件加载),务必放在 static 块里,保证只执行一次且线程安全
按业务域建专用类,拒绝“万能常量类”
把所有常量塞进一个 AllConstants 或 Constants 类,是大型项目中最常见的技术债源头。它模糊边界、引发编译耦合、阻碍重构。
- 按职责拆分:比如 HttpConstants(含超时、重试、状态码)、DbConstants(驱动名、连接池参数)、FeatureFlags(开关标识)
- 每个类加私有构造器防止实例化:private HttpConstants() {}
- 禁用接口定义常量:接口本意是契约,不是数据容器;实现类会隐式继承全部字段,造成语义污染和潜在命名冲突
统一用“类名.常量名”方式访问
哪怕在定义类内部,也应写 HttpConstants.TIMEOUT,而非直接用 TIMEOUT(除非已静态导入且上下文极明确)。这是可维护性的底线。
- 好处:一眼看出来源,支持 IDE 跳转、全局搜索、批量重命名
- 避免歧义:两个类都定义了 MAX_RETRY,不带类前缀极易误用
- 杜绝错误写法:禁止用实例引用访问(如 new AppConfig().DEFAULT_TIMEOUT_MS),违背常量设计本意
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










