Java中定义常量最标准方式是public static final修饰变量并全大写加下划线命名,static确保类级共享,final保证不可变,需声明时或静态块初始化,引用类型须用不可变容器。

Java 中定义常量最标准、最常用的方式是用 public static final 修饰变量,并配合全大写加下划线的命名规范。
必须用 static final 才算真正意义上的类级常量
单独的 final 只表示“每个实例一份、不可重新赋值”的字段,不是全局共享的常量。要让常量属于类本身、所有对象共用、且能被直接通过类名访问,必须加上 static:
public static final int MAX_CONNECTIONS = 100;public static final String DB_URL = "jdbc:mysql://localhost:3306/app";- 这类变量在类加载时初始化,编译器可能将其内联(尤其基本类型和字符串字面量),修改后需重新编译所有引用处
必须在声明时或静态初始化块中完成初始化
static final 字段不能留空,否则编译报错 “variable might not have been initialized”:
- 推荐写法:直接在声明处赋值,清晰且安全
- 复杂逻辑可放静态代码块:
public static final Map<string integer> STATUS_MAP;</string>static {<br> STATUS_MAP = new HashMap<>();<br> STATUS_MAP.put("ACTIVE", 1);<br> STATUS_MAP.put("INACTIVE", 0);<br>}
引用类型常量要防内容被修改
final 只锁住引用地址,不锁对象内部状态。下面写法看似常量,实则不安全:
立即学习“Java免费学习笔记(深入)”;
-
public static final List<string> NAMES = new ArrayList();</string>→NAMES.add("Alice")合法但破坏常量语义 - 安全做法:
public static final List<string> NAMES = List.of("Alice", "Bob");</string>(Java 9+) - 或:
public static final List<string> NAMES = Collections.unmodifiableList(new ArrayList(Arrays.asList("Alice")))</string>
命名和访问要符合惯例
常量名全部大写,单词间用下划线分隔,访问时直接用类名点调用:
- 定义:
public class Config { public static final long TIMEOUT_MS = 5000L; } - 使用:
long timeout = Config.TIMEOUT_MS; - 不建议省略
public—— 常量通常需跨类访问;不建议省略static—— 否则不是常量而是只读实例字段


















