【问题标题】:Why does Java Collections have helpers for 0 or 1 but not more elements?为什么 Java Collections 有 0 或 1 个元素的助手,但没有更多元素?
【发布时间】:2010-11-04 19:32:05
【问题描述】:

如果我想要一个空映射或单元素映射,Java Collections 有一个方法。为什么没有一种以上元素的方法?创建包含 2 个元素的静态最终地图的最佳方法是什么?我知道我可以这样做:

private static final Map<String, String> MAP = new HashMap<String, String>() {
    { put("a", "b"); put("c", "d"); }
};

但随后 Eclipse 抱怨 serialVersionUID...

【问题讨论】:

  • 我不确定我是否完全理解你的问题 - 你想在一次调用中插入一整组元素吗?就像put 可以一次将多个元素放入地图?
  • @birryree 是的,我想在一次调用中创建静态最终地图,或者尽可能少的样板文件。即使使用您描述的 put,您也必须声明一个 serialVersionUID 才能让 Eclipse 满意。
  • @Jeremy 最好等待支持 lambda 的 Java 8 :) 时间太长了!
  • 你可以让Eclipse添加一个序列号...

标签: java collections guava


【解决方案1】:

Collections 具有用于 0 和 1 入口映射的方法的原因是因为它们是特殊情况......例如,空的 Map 是一个不可变的单例。

不过,对于您想做的事情,我强烈建议您使用Guava。我认为它的Immutable* 集合(特别是ImmutableMap)是您想要的:

private static final ImmutableMap<String, String> MAP = ImmutableMap.of(
    "a", "b",
    "c", "d");

小地图你可以做上面的,大地图你可以写:

private static final ImmutableMap<String, String> MAP = 
    ImmutableMap.<String, String>builder()
      .put("a", "b")
      .put("b", "c")
      ...
      .put("y", "z")
      .build();

如果您不使用 Guava,您可能仍需要确保此地图无法更改。这更难看:

private static final Map<String, String> MAP;

static {
  Map<String, String> temp = new HashMap<String, String>();
  temp.put("a", "b");
  temp.put("b", "c");
  MAP = Collections.unmodifiableMap(temp);
}

【讨论】:

  • 很好的答案,刚刚学到了不少关于收藏的知识,谢谢!
【解决方案2】:

像地图这样的可变对象即使是静态的和最终的,也会被更改。 final 只是意味着对对象的引用不能改变。您不需要在初始化时添加对象。地图可以添加到代码的其他区域或以其他方式修改,但以后不能将不同的对象分配给变量MAP

如果你想用两个项目来初始化它,你可以在声明之后将它们添加到一个静态块中。

static { 
   MAP.put("a", "b"); 
   MAP.put("c", "d");
}

This article 提供了一些关于静态块如何工作的有用信息。

如果您想要一个包含两个项目的不可变地图,您可以再次使用静态块,如下所示:

private static final Map<String, String> MAP;
static {
    Map<String, String> tempMap = new HashMap<String, String>();
    tempMap.put("a", "b");
    tempMap.put("c", "d");
    MAP = Collections.unmodifiableMap(tempMap);
}

【讨论】:

    【解决方案3】:

    试试这个(Mark Storer 所写的修改版):

    private static final Map<String, String> Map = buildMap();
    
    private static Map<String, String> buildMap() {
      Map<String, String> map = new HashMap<String, String>();
      map.put("a", "b");
      map.put("c", "d");
      return Collections.unmodifiableMap(map);
    }
    

    【讨论】:

    • (或者使用 static 初始化器,取决于口味。另外,可能(或可能不)想要为地图添加容量,IIRC 应该至少比大小。)
    【解决方案4】:

    使用静态函数的返回值:

    private static final Map<String, String> Map = buildMap();
    
    private static Map<String, String> buildMap() {
      Map<String, String> map = new HashMap<String, String>();
      map.put("a", "b");
      map.put("c", "d");
      return map;
    }
    

    编辑:不。我的 C/C++“const”思维正在显现。 final 变量只能被赋值一次,但赋值给该变量的对象仍然是可变的。

    【讨论】:

      【解决方案5】:

      如果他们为任何 N 提供 0..N,您会问为什么不支持 N+1。 N=0 和 N=1 是很容易处理的特殊情况。

      【讨论】:

      • 什么意思,只有三种情况:0、1、大于1
      猜你喜欢
      • 1970-01-01
      • 2019-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-14
      • 1970-01-01
      相关资源
      最近更新 更多