在Java中创建常量字符串映射的更简洁的方法
大家好,在Java中创建常量字符串映射的更简洁的方法,java,map,Java,Map,大家好, 考虑以下代码示例: 导入java.util.HashMap; 导入java.util.Map public class StaticPractice { private final Map<String, String> mapperMap; public StaticPractice(){ mapperMap = new HashMap<String, String>(); mapperMap.put("F
考虑以下代码示例: 导入java.util.HashMap; 导入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
}
}
公共课堂实践{
私有最终地图mapperMap;
公共实践(){
mapperMap=newhashmap();
mapperMap.put(“Foo1”、“Bar1”);
mapperMap.put(“Foo2”、“Bar1”);
mapperMap.put(“Foo3”、“Bar2”);
mapperMap.put(“Foo3”、“Bar3”);
//...
mapperMap.put(“MoreFoo”、“BarAgain”);
}
公共无效剂量测定法(){
//使用mapperMap
}
}
我正在寻找一种更简洁的方法来创建一个映射数据结构,该结构包含大量常量字符串映射到大量其他常量字符串。在使用中,该示例远远不是“干净”或优雅的,而且非常冗长(有许多预定义的常量映射)该类的目标是映射这些预定义常量字符串引用的对象。在我的特定代码约定中,对所有字符串常量使用私有静态最终字符串是很常见的,这个示例也打破了该约定。
非常感谢您的任何意见,来自您的丰富知识总是让我感到谦卑
非常感谢。
编辑:要求不指定任何外部文件。如果希望它是一个
最终字符串
,则始终可以使用两个常量字符串创建一个类,并使用该类的对象列表
您可以这样做:
class MapClass {
private static final String key;
private static final String value;
}
List<MapClass> l = new ArrayList<>();
类映射类{
私有静态最终字符串密钥;
私有静态最终字符串值;
}
列表l=新的ArrayList();
如果希望它成为最终字符串
,则始终可以创建一个包含两个常量字符串的类,并使用该类的对象列表
您可以这样做:
class MapClass {
private static final String key;
private static final String value;
}
List<MapClass> l = new ArrayList<>();
类映射类{
私有静态最终字符串密钥;
私有静态最终字符串值;
}
列表l=新的ArrayList();
我认为您可以尝试使用属性而不是映射,或者通过读取配置文件中的字符串来初始化映射。我认为您可以尝试使用属性而不是映射,或者通过读取配置文件中的字符串来初始化映射。一种方法是创建生成映射的生成器类。这样做的优点是可以优化简洁的语法。您还可以做一些事情,比如使生成的映射不可变——如果您想将其用作公共可访问的常量,那么这很有用
在您的示例中,我注意到您有多个键映射到同一个值。因此,如果有一个方法,该方法接受一个值,后跟一个键列表,则更为简洁。您还可以通过让生成器返回自身使其更加简洁,以便可以“链接”方法调用:
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();
类生成器{
final Map=new HashMap();
生成器添加(V值、K…键){
用于(K键:键){
map.put(键、值);
}
归还这个;
}
映射构建(){
返回集合。不可修改映射(新HashMap(map));
}
}
//用法:
mapperMap=newbuilder()
添加(“Bar1”、“Foo1”、“Foo2”)
.添加(“Bar2”、“Foo3”)
...
.build();
或者,您可以看看Guava类,它有一个使用链接语法的构建器,尽管它没有一种方法可以在一次调用中将多个键映射到一个值。一种方法是创建一个生成映射的构建器类。这样做的优点是可以优化简洁的语法。您还可以做一些事情,比如使生成的映射不可变——如果您想将其用作公共可访问的常量,那么这很有用 在您的示例中,我注意到您有多个键映射到同一个值。因此,如果有一个方法,该方法接受一个值,后跟一个键列表,则更为简洁。您还可以通过让生成器返回自身使其更加简洁,以便可以“链接”方法调用:
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();
类生成器{
final Map=new HashMap();
生成器添加(V值、K…键){
用于(K键:键){
map.put(键、值);
}
归还这个;
}
映射构建(){
返回集合。不可修改映射(新HashMap(map));
}
}
//用法:
mapperMap=newbuilder()
添加(“Bar1”、“Foo1”、“Foo2”)
.添加(“Bar2”、“Foo3”)
...
.build();
或者,您可以看看Guava类,它有一个使用链接语法的生成器,尽管它没有一种方法可以在一次调用中将多个键映射到一个值。我知道的最简洁的方法是将映射定义为带有实例初始值设定项的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");
}});
private final Map mapperMap=
Collections.unmodifiableMap(新的HashMap(){{///实例初始值设定项
卖出(“Foo1”、“Bar1”);
看跌期权(“Foo2”、“Bar1”);
看跌期权(“Foo3”、“Bar2”);
卖出(“Foo3”、“Bar3”);
}});
我所知道的最简洁的方法是使用实例初始值设定项将映射定义为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");
}});
private final Map mapperMap=
Collections.unmodifiableMap(新的HashMap(){{///实例初始值设定项
卖出(“Foo1”、“Bar1”);
看跌期权(“Foo2”、“Bar1”);
看跌期权(“Foo3”、“Bar2”);
卖出(“Foo3”、“Bar3”);
}});
< /代码>如果映射的数目是常数,则可以考虑创建枚举。此外,你不能真的添加<代码> Foo3不止一次,最后一个替换了现有的.@ BheshGurung,你可以添加一次以上的FoO3,只是最后一个替换了第一个,正如你注意到的:如果映射的数量是常数,那么你可以考虑创建一个枚举。另外,您不能多次添加Foo3
,最后一个将替换现有的一个。@BheshGurung您可以多次添加Foo3,只需最后一个替换第一个,正如您所指出的:)谢谢您的输入,我将投票支持您的贡献。这一要求使得不需要使用外部文件。谢谢你的输入,我会投票给你