在 Java 中硬编码 Map 的其他方法?

问题描述 投票:0回答:4

我的 Java 程序中有一个 HashMap,由大约 200 个键值对组成,这些键值对在运行时不会改变,我正在寻找一种初始化所有键值对的好方法。 目前我有一个像这样的硬编码方法

private void initializeHashMap(){
    hashMap.put(1, "String1");
    hashMap.put(2, "String2");
    hashMap.put(3, "String3");
...}

所有 200 对。 这真的是很好的做法吗?还是有另一种更好的方法可以从另一个类或外部文件中读取数据?

java hashmap
4个回答
7
投票

这是考虑 properties 文件的完美用例。 当您阅读该文件时,它会为您提供一张方便使用的地图。


4
投票

另一种在可读性方面较差但在简洁性方面更好的替代方案(我将在个人项目中使用,但在团队工作中避免使用)是使用在实例化时定义其键/值的匿名类:

Map<Integer,String> myMap = new HashMap<Integer,String>(){{
    this.put(1, "String1");
    this.put(2, "String2");
}};

现在您不再实例化

HashMap
,而是实例化扩展它的匿名类。这个匿名类的定义包含一个实例初始化块,该块将在构造函数之后执行,并将设置所需的键/值。


2024 年编辑:

以上仅适用于 Java 8 及更早版本。
在 Java 9+ 中,您将需要使用

Map.of(...)
方法:

Map<Integer,String> myMap = Map.of(
    1, "String1",
    2, "String2"
)

请注意,结果

Map
是不可变的;如果这对你不好,你可以从中构建一个可变的
Map
:

Map<Integer, String> myMap = new HashMap<>(Map.of(...));

0
投票

我发现使用硬编码数组的流式传输可能是一种非常巧妙的方法。

String[] contents = new String[] {
        "1:String1",
        "2:String2",
        "3:String3"
};
Map<Integer,String> hashMap = Arrays.stream(contents)
        .collect(Collectors.toMap(
                // Key.
                s -> Integer.valueOf(s.split(":")[0]),
                // Value.
                s -> s.split(":")[1]
        ));

数据列表更容易维护,例如,您通常可以通过电子表格使其保持最新。


0
投票

您可以考虑属性文件,因为它会返回您的地图,并有助于配置和测试。

如果您有兴趣为其维护一个单独的类,那么您可以继续使用实例块,

   public Class Data{
      private static class MyMap extends HashMap<Integer, String>{
          private static final long serialVersionUID=1l;
          private MyMap(){
                this.put(1,"string1");
                this.put(2,"string2");
                this.put(3,"string3");
                this.put(4,"string4");
         }
      }
  public static final Map<Integer, String> fixedData=Collections.unmodifiable(new MyMap());
}

然后在您的课堂上您可以按如下方式使用它。

Class YourClass{
     private static final Map<Integer, String> map;
      static{
        map=Data.fixedData;
      }

   public final String getValue(final int key){
      return map.containsKey(key) ? map.get(key) : "";

   }
 }
© www.soinside.com 2019 - 2024. All rights reserved.