java定义常量需用public static final修饰变量并遵循upper_snake_case命名,primitive和string字面量可内联,引用类型须保证逻辑不可变;推荐用枚举替代多值常量组。

Java 中定义常量的核心是用 public static final 修饰变量,并配合大写下划线命名法(UPPER_SNAKE_CASE),同时确保其值不可变(primitive 类型天然不可变,引用类型需保证对象状态不被修改)。
用 public static final 定义基本类型常量
这是最常见、最安全的方式。编译器会将 primitive 类型和 String 字面量常量直接内联,运行时无法修改。
- 必须用 static final:static 表示属于类而非实例,final 阻止重新赋值
- 推荐加 public(若需跨类访问),或根据访问控制需要使用 protected / 包级私有
- 初始化必须在声明时或静态代码块中完成,否则编译报错
public class NetworkConfig {
public static final int DEFAULT_TIMEOUT_MS = 5000;
public static final String API_BASE_URL = "https://api.example.com";
public static final boolean ENABLE_RETRY = true;
}
引用类型常量要保证“逻辑不可变”
final 只能防止变量指向新对象,不能阻止对象内部状态改变。因此对 List、Map、自定义对象等,需额外防护。
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 优先使用不可变集合:如
Collections.unmodifiableList()、ImmutableList.of()(Guava)或 Java 10+ 的List.copyOf() - 自定义类应设为 final 类,所有字段为 private final,不提供 setter,构造后不暴露可变内部状态
- 避免返回可变内部对象的引用(如 getter 中返回 new ArrayList(this.items) 而非原始引用)
public class HttpStatus {
private static final List<integer> CLIENT_ERROR_CODES;
static {
List<integer> codes = Arrays.asList(400, 401, 403, 404, 429);
CLIENT_ERROR_CODES = Collections.unmodifiableList(new ArrayList(codes));
}
public static final List<integer> getClienteErrorCodes() {
return CLIENT_ERROR_CODES; // 安全返回不可变视图
}
}</integer></integer></integer>
命名严格遵循 UPPER_SNAKE_CASE 规范
这是 Java 社区广泛接受的常量命名约定,增强可读性与一致性,也便于 IDE 和静态检查工具识别。
- 全部大写字母,单词间用单个下划线连接(如
MAX_RETRY_ATTEMPTS) - 避免数字开头、不使用驼峰(
maxRetryAttempts是变量名,不是常量名) - 类名本身建议以 Const、Constants 或 XXXConfig 结尾(非强制,但利于归类)
- 包路径中常量类通常放在
xxx.util或xxx.constant下
进阶建议:用枚举替代多值常量组
当一组相关常量具有行为或属性(如 HTTP 状态码带描述、重试策略带退避规则),枚举比分散的 static final 更安全、更面向对象。
- 枚举实例天然 public static final,且不可被继承或实例化
- 可在枚举中封装方法、字段,支持 switch 语义清晰,IDE 可补全和校验
- 避免魔法字符串/数字散落各处,提升可维护性
public enum CachePolicy {
NO_CACHE(0),
SHORT_LIVED(30),
LONG_LIVED(3600);
private final int seconds;
CachePolicy(int seconds) { this.seconds = seconds; }
public int getTtlSeconds() { return seconds; }
}Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










