用于实例化初始化集合的紧凑语法

时间:2010-09-22 13:02:26

标签: java collections initialization

我正在寻找一种紧凑的语法来实例化一个集合并为其添加一些项目。我目前使用这种语法:

Collection<String> collection = 
    new ArrayList<String>(Arrays.asList(new String[] { "1", "2", "3" }));

我似乎记得有一种更紧凑的方法,它使用ArrayList的匿名子类,然后在子类的构造函数中添加项。但是,我似乎无法记住确切的语法。

6 个答案:

答案 0 :(得分:28)

答案 1 :(得分:8)

我猜你在考虑

collection = new ArrayList<String>() { // anonymous subclass
     { // anonymous initializer
         add("1");
         add("2");
         add("3");
     }
}

,其中一个是comapcted,给出了

collection = new ArrayList<String>() {{ add("1"); add("2"); add("3"); }}

FUGLY,至少可以这么说。但是,Arrays.asList方法有一个变体:Arrays.asList(T...a),它提供comapcity和可读性。例如,它提供以下代码行:

collection = new ArrayList<String>(Arrays.asList("1", "2", "3")); // yep, this one is the shorter

请注意,您不会创建可疑使用的ArrayList的匿名子类。

答案 2 :(得分:2)

也许那是

Collection<String> collection = new ArrayList<String>() {{
    add("foo");
    add("bar");
}};

也称为双括号初始化。

答案 3 :(得分:1)

您可以创建实用程序功能:

@SafeVarargs
public static <T> List<T> listOf(T ... values) {
    return new ArrayList<T>(Arrays.asList(values));
}

所以你可以这样称呼它:

collection = MyUtils.listOf("1", "2", "3");

这样,您可以非常轻松地填充列表,并使其保持可变性。

答案 4 :(得分:0)

答案 5 :(得分:0)

也许这只是我,但我没有看到使事情复杂化的问题,纯粹是为了追求编写更短/更快的代码。如果选择输入的代码少一些,并且更容易调试/修改,我很确定我会选择第二个选项。

因此,除非有特别的理由要求保持这种简短,否则我会坚持使用Ockham的剃刀,并且给出了一些问题的解决方案,请选择最简单的一种。这样一来,当出现问题时(墨菲的法律明确规定它将会出现),你将有更容易的时间来追踪它。 :)