在 Java 企业应用程序中使用翻译映射时,如何获得良好的编码风格和易于维护?

Posted

技术标签:

【中文标题】在 Java 企业应用程序中使用翻译映射时,如何获得良好的编码风格和易于维护?【英文标题】:how do I get a nice Coding-Style and easy maintenance when using translation maps in an Java Enterprise App? 【发布时间】:2013-03-02 15:24:14 【问题描述】:

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

有一个模块需要

    从对象中提取数据 地图数据参数,例如 SE -> 瑞典 [目前仅适用并在本模块中使用] 将这些新参数发送到某个地方(例如通过电子邮件/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");
    ...
;

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

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

【问题讨论】:

更改或添加国家代码的可能性有多大? 可能三年一次 好吧,既然如此,为什么不把它放在一个Java方法中呢?你可以把它放在一个单独的帮助类中,作为一个像static Map&lt;String, String&gt; getCountryCodes()这样的静态方法。如果您决定切换到数据库或配置文件,您只需更改此代码以读取该文件并传递内容,而反之则更加困难。 【参考方案1】:

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

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

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

您对 3 号的保留意见是这样的

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

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

general.translation.countrycodes.Andorra

【讨论】:

【参考方案2】:

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

例子:

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");
    

【讨论】:

以上是关于在 Java 企业应用程序中使用翻译映射时,如何获得良好的编码风格和易于维护?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Java lambda 遍历列表映射并返回单个值? [复制]

打字稿路径映射未在节点应用程序中翻译

3.Hibernate 映射类型

SSH的端口为啥是22(翻译)

【翻译】JMV GC 停顿时间过长问题排查

百度翻译团队获“2021年大数据科技传播奖”未来奖