在N个常量之间实现链接的最佳方法

时间:2017-08-24 09:08:12

标签: java hashmap constants

我找不到更好的标题(如果找到更好的标题,请随时编辑它),但用例如下。我有两个常量列表。其中一个包含我在我的应用程序中使用的常量,另一个包含通过CSV文件(以及数据)发送给我的不同常量。

举一个粗略的例子:在CSV文件中,有一个名为“客户端ID”的字段。在我的应用程序中,我想使用一个名为“clientId”的字段。所以我基本上需要在两个常量之间创建一个静态链接,这样我就可以轻松地从一个到另一个切换,具体取决于我需要实现的目标。

我考虑过创建静态Map(String, String)值,但我认为可能有更好的解决方案。

谢谢!

编辑:将标题更改为“N”常量而不是2,因为在这种情况下,Hashmap似乎不再是一个选项。

4 个答案:

答案 0 :(得分:1)

你可以使用双支架innitializer成语来保持地图初始化接近地图声明,所以它不会那么“难看”,例如:

static Map<String, String> someMap = new HashMap<String, String>() {{
        put("one", "two");
        put("three", "four");
}};

请注意,如果没有static修饰符,则每个匿名类(在此示例中创建一个)都会保持对封闭对象的引用,如果您将此映射的引用提供给其他类,则会阻止封闭的类是垃圾收集。

幸运的是,我们希望我们使用java更新,在java 9中将有一个非常方便的Map.of()来帮助我们更安全地完成它。

答案 1 :(得分:0)

将映射与应用程序代码分开的最佳方法是使用属性文件,在其中定义映射。

例如,您可以在资源的根目录中使用old = {'a': '1a', 'b': '1b' ,'c': '1c'} new = {'1a': 'c', '1b': 'd', '1c': 'e'} new_dict = {k: new.get(old[k]) for k in old} >>> new_dict {'a': 'c', 'b': 'd', 'c': 'e'} 并使用以下代码加载它们:

csv-mapping.properties

这就像 Map 一样,增加了代码与配置的分离。

答案 2 :(得分:0)

您可以使用许多方法轻松解决这些类型的问题。 一种方法是使用属性文件或包含键值对的文件。

以下是属性的代码。

import java.util.ResourceBundle;

public class ReadingPropertiesFile {
    public static void main(String[] args) {
         ResourceBundle messages;
         messages = ResourceBundle.getBundle("msg");
         System.out.println(messages.getString("ID"));
    }
} 

msg.properties文件包含值::

ID = ClientID。 PRODUCT_ID = prod_ID

该程序的输出是ClientID。

您还可以从简单的文本文件中读取。或者您可以在使用时使用地图。但我建议你使用属性文件。

答案 3 :(得分:0)

一个好的选择是使用枚举在多个常量之间创建这样的映射到单个常识值,例如:

import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

public enum MappingEnum {
    CLIENT_ID("clientId",    "id of the client", "clientId", "IdOfTheClient"), 
    CLIENT_NAME("clientName",    "name of the client", "clientName");

    private Set<String> aliases;
    private String commonSenseName;

    private MappingEnum(String commonSenseName, String... aliases) {
        this.commonSenseName = commonSenseName;
        this.aliases = Collections.unmodifiableSet(new HashSet<String>(Arrays.asList(aliases)));
    }

    public static MappingEnum fromAlias(String alias) {
        for (MappingEnum mappingEnum : values()) {
            if (mappingEnum.getAliases().contains(alias)) {
                return mappingEnum;
            }
        }
        throw new RuntimeException("No MappingEnum for mapping: " + alias);
    }

    public String getCommonSenseName() {
        return commonSenseName;
    }
}

然后您就可以使用它:

String columnName = "id of the client";
String targetFieldName = MappingEnum.fromAlias(columnName).getCommonSenseName();