3

想象一下,您正在编辑一个大型的后台企业 Java 应用程序,其他人可能会在几年后在该应用程序中闲逛。这意味着您必须保持代码干净且易于理解,性能可能不是第一要务。

有一个模块需要

  1. 从对象中提取数据
  2. 地图数据参数,例如 SE -> Sweden [目前仅适用于本模块并在此模块中使用]
  3. 将这些新参数发送到某个地方(例如通过电子邮件/xml)

对于一小组数据,我会使用一个小的 HashMap,但是必须转换的自定义数据表已经增长到 3 个 HashMap,其中一些元素大约有 100 个。我将它们放在一个名为 Translator.Java 的文件中

我有一个方法:

public String getCountryCode(String country) {
    return countryCodes.get(country);
}

这是由

countryCodes = new HashMap<String, String>() {{
    put("Andorra", "AD");
    put("Afghanistan", "AF");
    ...
}};

它看起来很丑!但我的选择似乎是:

  1. 在新数据库中创建一个数据库表,当编码人员只想查看什么映射到什么时,这会增加另一层混淆。也不需要更改这些数据,如果是这样,最好作为代码更改完成,因为数据库不受源代码控制!(我们使用休眠)
  2. 将此静态数据存储为配置文件,应用程序使用数据库表进行配置选项,这将增加维护。
  3. 使用配置数据库表来存储它,这会起作用,但也可能使其余配置选项更难找到,因为配置表中的其他类型的数据相对较小且具有凝聚力。
4

2 回答 2

0

尝试使用简单的枚举,这是非常有效且易于维护的。

例子:

public enum Country {
    ANDORRA("AD"),
    AFGHANISTAN("AF"),
    ...;

    private String code;

    private Country(String code) {
        this.code = code;
    }

    public static String findCountryCode(String country) {
        return valueOf(country.toUpperCase()).getCode();
    }

    public String getCode() {
        return code;
    }
}


public class CountryTest {
    @Test
    public void testGetCode() throws Exception {
        assertThat(Country.findCountryCode("Andorra")).isEqualTo("AD");
    }
}
于 2013-04-26T19:09:37.710 回答
0

编辑:我不能从你的问题中完全确定映射应该走哪条路,或者你是否需要能够以两种方式进行查找。以下假设您正在通过国家名称的键查找国家代码作为值。

根据我的经验,3 号是最好的选择。在许多系统架构中,如果您需要更改硬编码映射,则必须重新部署应用程序。

我从您对第一个答案的评论中看到,您的映射可能每 3 年左右更改一次。但是,您不能保证;需求会发生变化,国际关系也会发生变化。

您对 3 号的保留意见是

这会起作用,但也可能使其余配置选项更难找到,因为配置表中的其他类型的数据相对较小且具有凝聚力。

解决这一点的方法是为配置数据库中的键设置一个定义明确且清晰的命名约定。例如,您可以在键名中使用多个级别的前缀来缩小配置值的预期使用范围/位置。例如:

general.translation.countrycodes.Andorra
于 2013-07-17T12:34:08.810 回答