Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中创建常量字符串映射的更简洁的方法_Java_Map - Fatal编程技术网

在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,只需最后一个替换第一个,正如您所指出的:)谢谢您的输入,我将投票支持您的贡献。这一要求使得不需要使用外部文件。谢谢你的输入,我会投票给你