在Java中创建常量String映射的更简洁方法

时间:2014-04-22 03:22:42

标签: java map

美好的一天,
考虑以下代码示例:

import java.util.HashMap; import java.util.Map;

public class StaticPractice {

    private final Map<String, String> mapperMap;

    public StaticPractice(){
        mapperMap = new HashMap<String, String>(); 
        mapperMap.put("Foo1", "Bar1");
        mapperMap.put("Foo2", "Bar1");
        mapperMap.put("Foo3", "Bar2");
        mapperMap.put("Foo3", "Bar3");
        //...
        mapperMap.put("MoreFoo", "BarAgain");
    }

    public void doSomething(){
        //use mapperMap    
   }
}

我正在寻找一种更简洁的方法来创建一个Map数据结构,它有很多常量字符串映射到很多其他常量字符串。在使用中,这个例子远离&#34; clean&#34;或优雅,并且非常冗长(有很多预定义的常量映射)。

该类的目标是映射这些预定义常量字符串引用的对象。在我的特定代码约定中,对所有String常量使用private static final String是常见的,这个例子也打破了这个约定。

非常感谢任何投入,来自SO贡献者的丰富知识总是让我感到谦卑。
非常感谢。

编辑:要求不指定外部文件。

4 个答案:

答案 0 :(得分:3)

一种方法是创建一个生成地图的构建器类。这样做的好处是可以优化语法简洁。您还可以执行诸如使生成的映射不可变之类的操作 - 如果您希望将其用作可公开访问的常量,则非常有用。

在您的示例中,我注意到您有多个键映射到相同的值。因此,使用一个值后跟一个键列表的方法会更简洁。您还可以通过让构建器返回来使其更简洁,以便您可以链接&#34;方法调用:

class Builder<K,V> {
   final Map<K,V> map = new HashMap<K,V>();

   Builder add(V value, K... keys) {
      for(K key : keys) {
         map.put(key, value);
      }
      return this;
   }

   Map<K,V> build() {
      return Collections.unmodifiableMap(new HashMap<K,V>(map));
   }
}

// Usage:
mapperMap = new Builder<String,String>()
   .add("Bar1", "Foo1", "Foo2")
   .add("Bar2", "Foo3")
   ...
   .build();

或者,您可以查看Guava ImmutableMap类,该类具有使用链接语法的构建器,但它没有办法将多个键映射到一个调用中的单个值。

答案 1 :(得分:2)

我认为您可以尝试使用“属性”而不是通过从配置文件中读取字符串来映射或初始化地图。

答案 2 :(得分:1)

我所知道的最简洁的方法是使用实例初始化程序将您的地图定义为HashMap的匿名子类:

private final Map<String, String> mapperMap =
  Collections.unmodifiableMap(new HashMap() {{ // instance initializer
    put("Foo1", "Bar1");
    put("Foo2", "Bar1");
    put("Foo3", "Bar2");
    put("Foo3", "Bar3");
}});

答案 3 :(得分:0)

如果你希望它是final String,你总是可以创建一个包含几个常量字符串的类,并使用该类的对象列表。

你可以这样做:

class MapClass {
    private static final String key;
    private static final String value;
}

List<MapClass> l = new ArrayList<>();