美好的一天,
考虑以下代码示例:
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贡献者的丰富知识总是让我感到谦卑。
非常感谢。
编辑:要求不指定外部文件。
答案 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<>();