2014-10-02 18 views
10

Wstęp: to pytanie ma zostało zadane here, ale zastanawiam się konkretnie nad jego szczególnym znaczeniem.Jeśli jawnie inicjujesz tablicę obiektów w Javie, to czy "nowy obiekt []" różni się od tego, że jej nie zawiera?

Przeczytam przez Myślenie w Javie, 3rd ed. Revision 4.0 i Eckel pokazuje ten fragment w rozdziale 4, Inicjowanie i Oczyszczanie:

public class ArrayInit 
{ 
    public static void main(String[] args) 
    { 
    Integer[] a = 
    { 
     new Integer(1), 
     new Integer(2), 
     new Integer(3), 
    }; 

    Integer[] b = new Integer[] 
    { 
     new Integer(1), 
     new Integer(2), 
     new Integer(3), 
    }; 
    } 
} 

i stwierdza, co następuje:

Pierwsza forma jest przydatna w czasach, ale to jest bardziej ograniczony od rozmiar tablicy jest określany w czasie kompilacji.
Druga forma zapewnia wygodną składnię do tworzenia i wywoływania metod, które mogą dać ten sam efekt co listy zmiennych zmiennych C (znane jako "varargs" w C). Mogą to być nieznane ilości argumentów oraz nieznane typy.

Nigdy nie wiedziałem, że są różne, jak opisuje Eckel. Według mnie są to zarówno tablice wielkości statycznej. Nie rozumiem, jak pierwszy jest bardziej "ograniczony" niż drugi.

O czym on mówi?

+2

Nie mam pojęcia, o czym on mówi; są one w pełni równoważne. –

+2

Albo zacytowałeś z kontekstu, albo on nie wie, o czym mówi. (Ustawiłbym kurs na 50:50.) –

+2

Myślę, że to błąd w jego książce [Jon Skeet wie, co się dzieje] (http://stackoverflow.com/questions/4706814/array-initialization-differences -java) – gtgaxiola

Odpowiedz

4

Myślę, że to może być tym, do czego odnosi się autor.

Od wersji Java 5 możemy zadeklarować funkcje z zmiennymi listami zmiennych.

public static int newStyleSum(final int... numbers) { 
    int sum = 0; 
    for (final int number : numbers) { 
     sum += number; 
    } 
    return sum; 
} 

Mogą być stosowane na przykład:

int s = newStyleSum(1, 2, 3, 4); 

Funkcja ta jest jedynie cukier syntaktyczny. Wewnętrznie anonimowa tablica jest przekazywana do funkcji.

Przed mieliśmy tej składni, powyższy przykład musiałby być zapisany jako:

public static int oldStyleSum(final int[] numbers) { 
    int sum = 0; 
    for (int i = 0; i < numbers.length; ++i) { 
     sum += numbers[i]; 
    } 
    return sum; 
} 

i nazywa się

int s = oldStyleSum(new int[]{1, 2, 3, 4}); // "second" form 

ale nie jako

int s = oldStyleSum({1, 2, 3, 4}); // "first" form (syntax error) 

które nawet dziś nadal jest błąd składniowy.

To może być naprawdę to, o czym mówi. Java 5 wyszła w 2004 roku, więc w przypadku książki z 2002 roku ma to sens.

Nowa składnia jest bardziej elastyczny i - najważniejsze - kompatybilny wstecz, więc możemy jeszcze zrobić

int s = newStyleSum(new int[]{1, 2, 3, 4}); 

lub, co ważniejsze,

int[] numbers = {1, 2, 3, 4}; 
int s = newStyleSum(numbers); 

jeśli chcemy.

2

Wygląda na to, że odnosi się do inicjatora macierzy, a konkretnie do: new Integer[]. Od the same chapter używając wyraźny inicjatora podano

Other.main(new String[]{ "fiddle", "de", "dum" }); 

pokazać przydatność przekazywanie tablicy do metody, która nie jest możliwa bez wyrażenia tablica inicjatora

1

masz rację, to nie dokonuje sens.

Oto what rev 2 used to say:

Jest to użyteczne w czasach, ale to jest bardziej ograniczony, ponieważ wielkość tablicy jest określona w czasie kompilacji. Ostatni przecinek na liście inicjalizatorów jest opcjonalny. (Ta funkcja ułatwia konserwację długich list.)

"To" tutaj odnosi się do "inicjowania tablic obiektów przy użyciu listy zamkniętej przez nawias klamrowy", co jest prawdą. Wygląda na to, że ktoś dokonał złej edycji, myśląc, że "to" odnosiło się do "pierwszej formy".

Mówi się, że druga forma jest użytecznym sposobem symulacji varargs, co było prawdą w tym czasie, ale Java od tego czasu uzyskała actual varargs. (Pierwsza forma może być używana tylko w deklaracjach tablicowych, a nie w wywołaniach metod i dlatego nie jest przydatna dla varargs).

+0

Czytam z wersji 4.0, a tekst, który umieściłem w moim pytaniu, jest skopiowany z tego. Ale to, co mówisz, ma sens. –

+0

@iAmMortos Ah, tego nie zauważyłem. Tak, po prostu zła, zła edycja. –