Java变量三种赋值优先级(默认/配置/命令行)优雅实现方案咨询
Java多源配置优先级赋值优化方案
需求说明
变量赋值优先级从低到高如下:
- 默认直接赋值
- 从properties配置文件读取(配置项可能不存在)
- 从命令行系统属性读取(可传入多个参数或不传入参数)
优先级越高的配置来源越优先生效。
原有实现问题
原有代码存在冗余的异常捕获逻辑:System.getProperty()传入固定合法的字符串键时,不会抛出NullPointerException或IllegalArgumentException,异常捕获块完全无实际作用,同时中间变量过多导致逻辑不够直观。
优化实现
基础版(无第三方依赖,兼容性好)
public static final String APP_DOWNLOAD_PATH; static { // 优先取命令行传入的系统属性 String commandLinePath = System.getProperty("download"); if (commandLinePath != null && !commandLinePath.trim().isEmpty()) { APP_DOWNLOAD_PATH = commandLinePath; } else { // 命令行无有效值则取配置文件,配置文件无值则用默认的用户工作目录 APP_DOWNLOAD_PATH = properties.getProperty("download", System.getProperty("user.dir")); } }
简洁版(Java 8+支持,链式调用更直观)
如果项目允许使用commons-lang3工具类,写法可以更简洁:
import org.apache.commons.lang3.StringUtils; import java.util.Optional; public static final String APP_DOWNLOAD_PATH; static { APP_DOWNLOAD_PATH = Optional.ofNullable(System.getProperty("download")) .filter(StringUtils::isNotBlank) .orElseGet(() -> properties.getProperty("download", System.getProperty("user.dir"))); }
通用工具方法版
如果有多个配置项都需要按该优先级逻辑取值,可以抽成通用工具方法复用:
/** * 按优先级获取配置值:命令行系统属性 > properties配置 > 默认值 * @param configKey 配置键名 * @param localProperties 本地properties配置文件对象 * @param defaultValue 最低优先级默认值 * @return 最终生效的配置值 */ public static String getPriorityConfig(String configKey, Properties localProperties, String defaultValue) { String systemValue = System.getProperty(configKey); if (systemValue != null && !systemValue.trim().isEmpty()) { return systemValue; } return localProperties.getProperty(configKey, defaultValue); } // 调用示例 public static final String APP_DOWNLOAD_PATH = getPriorityConfig("download", properties, System.getProperty("user.dir"));
内容的提问来源于stack exchange,提问作者Brazen
相关产品推荐
相关产品推荐

