代码之家  ›  专栏  ›  技术社区  ›  Dónal

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

  •  19
  • Dónal  · 技术社区  · 14 年前

    我正在寻找一种简洁的语法来实例化一个集合并向其中添加一些项。我目前使用以下语法:

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

    ArrayList ,然后在子类的构造函数中添加项。然而,我似乎记不清确切的语法。

    6 回复  |  直到 7 年前
        1
  •  39
  •   nanda    14 年前
        2
  •  10
  •   Riduidel    14 年前

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

    其中一个被捕获的

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

    Arrays.asList(T...a) 它提供了一致性和可读性。例如,它给出了以下代码行:

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

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

        3
  •  3
  •   Vivien Barousse    14 年前

    也许那是

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

    也称为双括号初始化。

        4
  •  2
  •   Haroldo_OK    8 年前

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

    所以你可以这样称呼它:

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

        5
  •  0
  •   Community Egal    7 年前
        6
  •  0
  •   posdef    14 年前

    也许只是我,但我不认为把事情复杂化有什么意义,纯粹是为了编写更短/更快的代码。考虑到输入的代码行要少一些,调试/修改要容易得多,我很确定我会选择第二个选项。