如何在一行中初始化静态ArrayList<myclass>?

36
我有一个MyClass类。
MyClass(String, String, int);

我知道如何使用以下方式向ArrayList添加元素:

MyClass.name = "Name";
MyClass.address = "adress";adress
MyClass.age = age;

然后像这样将其添加到ArrayList中:

list.add(MyClass);

但是现在我有许多以静态形式声明的 MyClass 对象,我想要添加

ArrayList<MyClass> list = new ArrayList<MyClass>({"Name","Address", age};.....);

我可以这样做吗?不管怎样,谢谢。


6
在Java中,类的命名应该像MyClass这样。 - user647772
6个回答

55

你可以使用双括号初始化:double braces initialization:


List<MyClass> list = new ArrayList<MyClass>() {
    {
        add(new MyClass("name", "address", 23));
        add(new MyClass("name2", "address2", 45));
    }
};

正如你所看到的,内部括号就像一个初始化块,用于一次性地初始化列表

还要注意你的双括号末尾的分号。


这个声明中应该真正使用List<MyClass>。 - RNJ
这很有趣,但是它在什么方面比只需在List<MyClass> list = new ArrayList<MyClass>()之后立即执行list.add(new...更好或更简单? - Denys Séguret
在myclass中是否需要构造函数,例如:myclass(string, string)? - Ngo Ky
@dystroy.. 我已经提供了一个关于 SO 上的帖子链接,其中描述了关于它的优缺点的一切。只需点击该链接即可。 - Rohit Jain
@NgoKy.. 你可以拥有任何类型的构造函数,并在此块中使用它。这并不重要。但是,理想情况下,你应该至少需要一个1个参数的构造函数,以便你可以在此处初始化你的对象(这就是你想要的)。否则,你将需要遍历你的列表来初始化“Object”的属性。 - Rohit Jain
但请注意,正如其他帖子所提到的那样,这可能会引入内存泄漏。它创建一个新的匿名内部类,该类持有对包含对象的引用。因此,如果您在某个地方引用了列表,而没有显式引用包含对象,则仍然无法对包含对象进行垃圾回收。 - Tohnmeister

29
你可以这样做。
List<MyClass> list = Arrays.asList(
                         new MyClass("Name", "Address", age),
                         // many more
                     );

注意:这将创建一个大小不可更改的列表。


1
这对于将常量(静态final)数组定义为类成员非常有效。 - William T. Mallard

8

像这样的:

List<MyClass> list = new ArrayList<MyClass>(Arrays.asList(new MyClass[] {new MyClass("Name", "Address", age}));

当然,你的类必须有一个像这样的构造函数:
public MyClass(String name, String address, int age) {
...
}

3
你可以这样实例化ArrayList:
new ArrayList<myclass>() {{
  add(new MyClass("Name", "Address", age));
}};

这将创建一个匿名内部类,实际上扩展了ArrayList,其中包含一个初始化块来调用add。这显然非常不好,并且会让你的同事想要伤害你,所以你应该使用Arrays.asList。 :)


1
如果您想要最干净和最简单的初始化,您可以使用以下代码:
    List<MyClass> list = MyClass.build(
        "Name", "Address", 51,  
        "a2", "c", 4,
        "v", "d", 2
    );

这个使用了这个实用方法:

public static List<MyClass> build(Object... array) {
    List<MyClass> list = new ArrayList<Test>();
    for (int i=0; i<array.length-2; i+=3) {
        list.add(new MyClass((String)array[i], (String)array[i+1], (Integer)array[i+2]));
    }
    return list;
}

0

以最有效的方式完成这个任务的“最佳”方法是:

List<MyClass> list = new ArrayList<MyClass>();

 list.add(new MyClass("name", "address", 23));
 list.add(new MyClass("name2", "address2", 45));

虽然需要打很多字,但显然这更高效

另一个选择是使用谷歌guava(未测试效率):

ArrayList<MyClass> list = new ArrayList<MyClass>(
           new MyClass("name", "address", 23), 
           new MyClass("name2", "address2", 45) );

所需的导入是 import static com.google.common.collect.Lists.newArrayList; 此外,您还可以使用双括号初始化,就像 @Rohit Jain 最初提出的那样:-
List<MyClass> list = new ArrayList<MyClass>() {
    {
        add(new MyClass("name", "address", 23));
        add(new MyClass("name2", "address2", 45));
    }
};

正如你所看到的,内部括号就像一个初始化器块一样,用于一次性初始化列表

注意在双括号末尾的分号。

还要注意最后一个方法有一些缺点,如此处所讨论的。


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