如何初始化一个公共的静态 final 只读 LinkedMap(双向映射)?

10

我想创建一个

public static final LinkedMap myMap;

我曾在某处找到类似于 Maps 的东西:

 public class Test {
        private static final Map<Integer, String> MY_MAP = createMap();

        private static Map<Integer, String> createMap() {
            Map<Integer, String> result = new HashMap<Integer, String>();
            result.put(1, "one");
            result.put(2, "two");
            return Collections.unmodifiableMap(result);
        }
    }

但是我无法将'unmodifiableMap'方法应用于LinkedMap。 有人可以帮帮我吗? 这是否可能?


1
你需要针对 LinkedMap 特定的方法吗?否则只需将 myMap 声明为 Map - ratchet freak
我需要一个LinkedMap,因为它具有双向性(我应该提到它来自commons.apache.org.collections)。 - Antje Janosch
2个回答

13

最流行的解决方法几乎肯定是GuavaImmutableMap。(披露:我是Guava的贡献者。)

Map<Integer, String> map = ImmutableMap.of(
  1, "one",
  2, "two");
或者
ImmutableMap<Integer, String> map = ImmutableMap
  .<Integer, String> builder()
  .put(1, "one")
  .put(2, "two")
  .build();

没有其他库的情况下,除了你所编写的方法,唯一的解决方法是

static final Map<Integer, String> CONSTANT_MAP;
static {
  Map<Integer, String> tmp = new LinkedHashMap<Integer, String>();
  tmp.put(1, "one");
  tmp.put(2, "two");
  CONSTANT_MAP = Collections.unmodifiableMap(tmp);
}

ImmutableMap是否提供双向性? - Antje Janosch
如果您想要双向性-并且您的意思是“我认为的意思”(http://code.google.com/p/guava-libraries/wiki/NewCollectionTypesExplained#BiMap),“ImmutableBiMap”将实现这一点。 - Louis Wasserman
所以,如果我需要某个值的键,我首先需要检索地图的反向,对吗? - Antje Janosch
没错,这是一个简单的常数时间操作:map.inverse().get(value) - Louis Wasserman

0

对我来说,声明一个等于函数Create()的变量毫无意义。

如果你需要一个最终变量myMap,你需要这样写:

// = createMap();
private final static LinkedHashMap<Integer, String> 
                                          myMap = new LinkedHashMap<Integer, String>();
static {
    myMap.put(1, "one");
    myMap.put(2, "Two");
};

public static void main(String[] args) {

  for( String link : myMap.values()){
    System.out.println("Value in myMap: "+link);
  }

}

或者如果您想使用create()函数,您需要从myMap中摆脱final关键字,并在主要函数中使用myMap:

    public static void main(String[] args) {

    myMap = Test.createMap();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接