多配置场景下如何选择合适数据类型优化存储与访问
问题
我有4套配置存储在Property文件中,所有配置的属性项一致但取值不同,配置示例如下:
####Config1#### conf1.password=admin conf1.username=admin conf1.context=123 conf1.name=localhost ####config2#### conf2.username=app conf2.password=app conf2.context=com conf2.name=localhost ####config3#### conf3.username=app conf3.password=app conf3.context=com conf3.name=localhost ####config4#### conf4.username=app conf4.password=app conf4.context=com conf4.name=localhost
我可以从Property文件中读取属性值,请问是否可以使用单个变量存储这些配置,并以高效、可读的方式访问?
我曾尝试为每套配置单独使用HashMap存储,但这会增加代码冗余,因为每套配置的处理步骤重复,还需通过if-else判断配置名称来获取HashMap值。现有代码示例如下:
HashMap<String, String> conf1 = new HashMap<>(); HashMap<String, String> conf2 = new HashMap<>(); HashMap<String, String> conf3 = new HashMap<>(); HashMap<String, String> conf4 = new HashMap<>(); conf1.put("UserName", prop.getProperty("conf1.username")); conf1.put("Password", prop.getProperty("conf1.password")); conf1.put("name", prop.getProperty("conf1.name")); conf1.put("context", prop.getProperty("conf1.context")); conf2.put("UserName", prop.getProperty("conf2.username")); conf2.put("Password", prop.getProperty("conf2.password")); conf2.put("name", prop.getProperty("conf2.name")); conf2.put("context", prop.getProperty("conf2.context")); // conf3... // conf4... if (Conf.equalsIgnoreCase("conf1")) { GenerateTestFile( "Name:" + conf1.get("name") + "-UserName:" + conf1.get("UserName") + "-Password:" + conf1.get("Password") + "-Context:" + conf1.get("context"), FileName); } else if (Conf.equalsIgnoreCase("conf2")) { GenerateTestFile( "Name:" + conf2.get("name") + "-UserName:" + conf2.get("UserName") + "-Password:" + conf2.get("Password") + "-Context:" + conf2.get("context"), FileName); } else if(Conf.equalsIgnoreCase("conf3")){…} else if(Conf.equalsIgnoreCase("conf4")){…}
解决方案
当然可以,推荐用实体类+Map的组合实现,既能消除冗余代码,又能大幅提升可读性和维护性:
1. 创建配置实体类
定义一个和配置项一一对应的实体类,把重复的属性封装起来,避免HashMap字符串键值对容易出现的拼写错误:
public class Config { private String username; private String password; private String context; private String name; // 构造方法 public Config(String username, String password, String context, String name) { this.username = username; this.password = password; this.context = context; this.name = name; } // Getter方法(按需添加Setter) public String getUsername() { return username; } public String getPassword() { return password; } public String getContext() { return context; } public String getName() { return name; } }
2. 用Map统一存储所有配置
用Map<String, Config>存放所有配置,键为配置名称(如"conf1"),值为对应实体对象。通过循环批量加载配置,彻底消除重复代码:
// 存储所有配置的容器 Map<String, Config> configMap = new HashMap<>(); // 配置名称列表,可根据实际情况扩展 List<String> configNames = Arrays.asList("conf1", "conf2", "conf3", "conf4"); // 循环加载每个配置 for (String configName : configNames) { String username = prop.getProperty(configName + ".username"); String password = prop.getProperty(configName + ".password"); String context = prop.getProperty(configName + ".context"); String name = prop.getProperty(configName + ".name"); // 将配置存入Map configMap.put(configName, new Config(username, password, context, name)); }
3. 简化配置访问逻辑
需要使用配置时,直接从Map中获取对应实体,无需一堆if-else判断:
// 统一转小写避免大小写匹配问题 Config targetConfig = configMap.get(Conf.toLowerCase()); if (targetConfig != null) { GenerateTestFile( String.format("Name:%s-UserName:%s-Password:%s-Context:%s", targetConfig.getName(), targetConfig.getUsername(), targetConfig.getPassword(), targetConfig.getContext()), FileName ); }
额外优化建议
- 若配置数量可能动态变化,可遍历Property的所有key自动识别配置组,无需手动维护
configNames列表; - 使用Lombok的
@Data注解,可自动生成Getter/Setter、构造方法等样板代码,进一步简化实体类; - 若基于Spring框架开发,可通过
@ConfigurationProperties注解直接将配置绑定到实体类,实现更自动化的配置加载。
内容的提问来源于stack exchange,提问作者Irregularz
相关产品推荐
相关产品推荐

