You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多配置场景下如何选择合适数据类型优化存储与访问

问题

我有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 21:35:37