java中真正的常量需用public static final组合声明:static确保类级别共享,final保证不可变,public支持跨类访问;命名全大写加下划线,必须声明时或静态块中初始化。

Java 中没有“全局变量”概念,所谓常量,是通过 final 和 static 组合声明的类级别不可变字段实现的。两者缺一不可:static 保证共享一份、属于类;final 保证初始化后不可再赋值。
必须用 public static final 组合声明
单独使用 final 只能约束单个对象里的字段不可改,但每个实例仍有一份副本;单独用 static 虽然共享,却可能被后续代码重新赋值——只有两者结合,才真正达成“一份、不变、跨类可用”的效果。
- public:让其他类能直接访问(若仅本包使用,可省略 public,但仍需遵守命名规范)
- static:类加载时初始化,所有对象共用同一内存地址
- final:基本类型锁定值,引用类型锁定引用地址(注意:内容仍可变,如 List.add() 合法)
命名和初始化要严格遵守规则
常量名必须全大写,单词间用下划线分隔;且必须在声明时或静态初始化块中完成初始化,不能依赖构造方法。
- 正确写法:public static final int MAX_RETRY = 3;、public static final String API_URL = "https://api.example.com";
- 错误写法:public static final int maxRetry = 3;(命名不合规)、public static final String URL;(未初始化,编译报错)
- 字符串和基本类型字面量会被编译器内联,修改后需重新编译所有引用处
引用类型常量要防内容被修改
final 只锁住引用本身,不锁住对象内部状态。比如声明 public static final List
- 若需真正不可变,应包装为不可修改视图:Collections.unmodifiableList(List.of("zh", "en"))
- 推荐优先使用不可变集合工厂方法,如 List.of()、Set.of()、Map.of()
- 自定义对象作为常量时,类本身也应设计为不可变(字段 final + 无 setter + 深拷贝返回)
统一放在专用配置类里管理
不要把常量散落在各个业务类中。新建一个不提供构造器、不被实例化的纯静态类,集中存放所有配置项。
- 例如建一个 AppConfig 类,只含 public static final 字段
- 避免静态块中做耗时操作(如读配置文件、连数据库),否则拖慢类加载
- 如果常量有逻辑分组(如 HTTP 相关、数据库相关),可用 enum 或嵌套静态类进一步组织
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











