应使用public static final在专用常量类中集中定义不可变全局配置,确保类型明确、结构清晰、安全可靠,并辅以初始化校验与运行时扩展机制。

用 public static final 统一收拢全局配置参数,核心是把不变的系统级参数集中定义、类型明确、不可篡改,并便于维护和校验。这不是简单堆字段,而是有结构、有边界、有安全意识的设计动作。
放在专用的常量类里,不混入逻辑
新建一个如 SystemConfig 或 AppConstants 的类,只放配置,不写方法、不依赖 Spring、不加载外部资源:
- 类声明为
public final class SystemConfig { private SystemConfig() {} },防止被实例化 - 所有字段用
public static final,顺序固定(推荐public static final,语义清晰) - 基本类型和字符串字面量直接赋值:
public static final int MAX_RETRY = 3; - 避免在字段声明行调用可能失败的方法(如
System.getProperty()),否则类加载会崩溃
数值类配置加简单校验,防误设
关键数值不能只靠约定,应在初始化时做基础合理性检查:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 用
Math.max(1, Integer.getInteger("app.max.tasks", 16))确保最小值合法 - 超时时间可转为
Duration:public static final Duration DEFAULT_TIMEOUT = Duration.ofSeconds(30); - 开关类布尔值建议用枚举替代
boolean,避免true/false含义模糊
避开可变对象陷阱,保证真正不可变
final 只锁住引用,不锁住内容。若存集合或自定义对象,必须确保其内部也不可变:
- 不要写
public static final List<string> SUPPORTED_LOCALES = new ArrayList();</string> - 改为
public static final List<string> SUPPORTED_LOCALES = List.of("zh-CN", "en-US");</string>(Java 9+) - 或用
Collections.unmodifiableList(new ArrayList(...))包装已有列表 - 自定义 POJO 必须是
record或手工实现不可变(所有字段private final,不提供 setter)
留好运行时扩展口子,不硬编码死
纯代码常量适合默认值;真要支持部署期调整,得与配置文件联动:
- 在 Spring 中,用
@Value("${app.timeout:${SYSTEM_TIMEOUT:5000}}")—— 先查配置项,再查系统属性,最后 fallback 到常量类里的值 - 常量类退为“默认值中心”,既保编译期检查,又不牺牲灵活性
- 环境变量名(如
SYSTEM_TIMEOUT)和配置项名(如app.timeout)保持统一命名风格,降低理解成本










