2012-10-01 22 views
21

mam MojaKlasa jakojak zainicjować statycznych ArrayList <myclass> w jednej linii

MyClass(String, String, int); 

wiem o tym, jak dodać dodać do ArrayList w ten sposób:

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

następnie dodać do ArrayList jak:

list.add(MyClass); 

ale teraz mam wiele MojaKlasa obiektów w postaci statycznego, chcę dodać

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

Czy mogę to zrobić. Dziękuję w każdym razie

+6

Klasy w Javie powinny mieć nazwy podobne do 'MyClass'. –

Odpowiedz

35

Można użyć double braces initialization: -

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

Jak widać, że inner braces jest niczym bloku initializer, który jest używany do inicjacji list za jednym razem ..

pamiętać Również średnik na końcu swojej double-braces

+0

To powinno być naprawdę na liście w deklaracji – RNJ

+0

@RNJ .. Tak, masz rację ... Zmodyfikuje to .. –

+0

To jest zabawne, ale w czym jest lepsze lub prostsze niż po prostu zrobienie 'list.add (now .. . "zaraz po" List list = new ArrayList () '? –

20

Można zrobić

List<MyClass> list = Arrays.asList(
         new MyClass("Name", "Address", age), 
         // many more 
        ); 

Uwaga: To będzie utworzyć listę, gdzie nie można zmienić jego rozmiar.

+0

+1; I prawdopodobnie to właśnie chce osiągnąć. – maba

+0

To działa ładnie do definiowania stałej (static final) tablicy jako członka klasy. –

7

coś takiego:

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

Oczywiście, klasa musi mieć konstruktora takiego:

public MyClass(String name, String address, int age) { 
... 
} 
3

Można instancję ArrayList tak:

new ArrayList<myclass>() {{ 
    add(new MyClass("Name", "Address", age)); 
}}; 

Stwarza anonimową klasę wewnętrzną, która faktycznie rozciąga ArrayList, ze związkiem blok inicjalizatora, który wywołuje add. Jest to oczywiście całkowicie obrzydliwe i sprawi, że Twoi koledzy będą chcieli cię skrzywdzić, więc powinieneś użyć zamiast tego Arrays.asList.:)

1

Jeśli to, co chcesz jest o najczystszy i najprostszy inicjalizacji, może mieć to:

List<MyClass> list = MyClass.build(
     "Name", "Address", 51, 
     "a2", "c", 4, 
     "v", "d", 2 
    ); 

ta wykorzystuje tę metodę użytkowy:

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

„Najlepsze” sposób to zrobić to w skuteczny sposób będzie:

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

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

chociaż wymaga to dużo pisania, ale jak można wyraźnie widać to bardziej efficient

Inną alternatywą byłoby użyć google guava (nie testowane na wydajność):

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

Wymagana import jest import static com.google.common.collect.Lists.newArrayList;

również można użyć podwójne szelki inicjalizacji jako pierwotnie zaproponowany przez @Rohit Jain: -

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

Jak widać, inner braces jest niczym bloku initializer, który jest używany do inicjacji list za jednym razem ..

zanotować średnik na końcu swojej double-braces

również pamiętać, że ostatnia metoda ma pewne wady, jak omówiono here .

Powiązane problemy