2011-09-25 7 views
8

Czy istnieje sposób utworzenia tablicy obiektów jako części konstruktora lub metody? Naprawdę nie jestem pewien, jak to powiedzieć, więc dodałem przykład. Mam wyliczenie, a jednym z pól jest tablica liczb. Oto, co próbowałem:Tworzenie tablicy podczas przekazywania jej jako argumentu w języku Java

public enum KeyboardStuff { 

    QWERTY(1, {0.5f, 1.3f, 23.1f}, 6); 
    DVORAK(5, {0.1f, 0.2f, 4.3f, 1.1f}, 91); 
    CHEROKEE(2, {22.0f}, 11); 

    private int number, thingy; 
    private float[] theArray; 

    private KeyboardStuff(int i, float[] anArray, int j) { 
     // do things 
    } 

} 

Kompilator mówi, że nawiasy {} są nieprawidłowe i powinny zostać usunięte. Czy istnieje sposób, w jaki mogę przekazać tablicę jako argument bez uprzedniego utworzenia tablicy obiektów?

Odpowiedz

26

Możesz spróbować z new float[] { ... }.

public enum KeyboardStuff { 

    QWERTY(1, new float[] {0.5f, 1.3f, 23.1f}, 6); 
    DVORAK(5, new float[] {0.1f, 0.2f, 4.3f, 1.1f}, 91); 
    CHEROKEE(2, new float[] {22.0f}, 11); 

    private int number, thingy; 
    private float[] theArray; 

    private KeyboardStuff(int i, float[] anArray, int j) { 
     // do things 
    } 

} 
+0

nie wiedziałem to było możliwe, dziękuję bardzo! – Tanaki

2

Czy istnieje sposób na przekazanie tablicy bez tworzenia tablicy?

Nie, ale można użyć varargs, aby uczynić go w większości niewidocznym, chociaż na końcu może być konieczne przeniesienie.

4

Po @ Dave sugerują chciałbym użyć vararg

QWERTY(1, 6, 0.5, 1.3, 23.1); 
DVORAK(5, 91, 0.1, 0.2, 4.3, 1.1); 
CHEROKEE(2, 11, 22.0); 

private final int number, thingy; 
private final double[] theArray; 

private KeyboardStuff(int number, int thingy, double... theArray) { 
    // do things 
} 

To jest dość rzadkie, że stosując float jest lepszy niż przy użyciu double. double ma mniejszy błąd zaokrąglenia i używa tylko 4 dodatkowych bajtów.

+0

@Dave też, prawie o tym zapomniałem. Dziękuję za to rozwiązanie, ale może być konieczne utworzenie więcej niż jednego parametru Object [], więc nie byłoby to idealne w tej sytuacji. – Tanaki

0

przypadku korzystania z list, zamiast tablic jest opcją, przyszłe wersje Javy może zacząć wspieranie „collection literals” składni, która niestety nie wydają się dokonały go w Java 8:

public enum KeyboardStuff { 

    QWERTY(1, [0.5f, 1.3f, 23.1f], 6); 
    DVORAK(5, [0.1f, 0.2f, 4.3f, 1.1f], 91); 
    CHEROKEE(2, [22.0f], 11); 

    private int number, thingy; 
    private List<Float> values; 

    private KeyboardStuff(int i, List<Float> values, int j) { 
     // do things 
    } 

} 
+0

Wygląda na to, że literały kolekcji niestety nie trafiły do ​​Java 8. – harperska