Umiem pisać:
AClass[] array = {object1, object2}
Mogę też napisać:
AClass[] array = new AClass[2];
...
array[0] = object1;
array[1] = object2;
ale nie mogę napisać:
AClass[] array;
...
array = {object1, object2};
Dlaczego jest to blokowane przez Javę?
Wiem, jak to obejść, ale od czasu do czasu byłoby to prostsze.
Na przykład:
public void selectedPointsToMove(cpVect coord) {
if (tab == null) {
if (arePointsClose(coord, point1, 10)) {
cpVect[] tempTab = {point1};
tab = tempTab;
} else if (arePointsClose(point2, coord, 10)) {
cpVect[] tempTab = {point2};
tab = tempTab;
} else {
cpVect[] tempTab = {point1,point2};
tab = tempTab;
}
}
}
To proste pytanie, które nurtowało mnie, odkąd nauczyłem się bawić tablicami w Javie.
Odpowiedzi:
Musiałbyś zapytać projektantów Java. Może istnieć jakiś subtelny gramatyczny powód tego ograniczenia. Zauważ, że niektóre konstrukcje tworzenia / inicjalizacji tablic nie były w Javie 1.0, a (IIRC) zostały dodane w Javie 1.1.
Ale „dlaczego” jest nieistotne… ograniczenie istnieje i trzeba z nim żyć.
Możesz to napisać:
źródło
{o1()}
było to prawidłowe wyrażenie i czy{o1();}
był prawidłowym blokiem instrukcji. Parser musi dostać się do '}' lub ';' zanim będzie mógł rozróżnić te dwa przypadki. Zagadnienie gramatyczne wcale nie jest subtelne !!Spróbuję odpowiedzieć na pytanie dlaczego: tablica Javy jest bardzo prosta i elementarna w porównaniu z klasami takimi jak ArrayList, które są bardziej dynamiczne. Java chce wiedzieć w momencie deklaracji, ile pamięci powinno być przydzielone dla tablicy. ArrayList jest znacznie bardziej dynamiczna, a jej rozmiar może się zmieniać w czasie.
Jeśli zainicjujesz swoją tablicę o długości dwóch, a później okaże się, że potrzebujesz długości trzech, musisz wyrzucić to, co masz, i utworzyć zupełnie nową tablicę. Dlatego słowo kluczowe „nowe”.
W pierwszych dwóch przykładach w momencie deklaracji podajesz, ile pamięci należy przydzielić. W trzecim przykładzie nazwa tablicy staje się wskaźnikiem do niczego, a zatem po jej zainicjowaniu musisz jawnie utworzyć nową tablicę, aby przydzielić odpowiednią ilość pamięci.
Powiedziałbym (a jeśli ktoś wie lepiej, proszę mnie poprawić) na pierwszym przykładzie
właściwie znaczy
ale projektanci Javy przyspieszyli zapis, jeśli utworzymy tablicę w czasie deklaracji.
Sugerowane obejścia są dobre. Jeśli czas lub użycie pamięci jest krytyczne w czasie wykonywania, użyj tablic. Jeśli nie jest to krytyczne i chcesz, aby kod był łatwiejszy do zrozumienia i obsługi, użyj ArrayList.
źródło
{
i}
... tak samo jak w przypadku dozwolonych formularzy inicjalizacyjnych.Nie mogę odpowiedzieć na pytanie dlaczego.
Ale jeśli chcesz czegoś dynamicznego, dlaczego nie weźmiesz pod uwagę kolekcji ArrayList.
ArrrayList może być dowolnego typu Object.
A jeśli jako wymuszenie chcesz, aby była to tablica, możesz użyć na niej metody toArray ().
Na przykład:
Mam nadzieję, że to ci pomoże.
źródło
Dla tych z Was, którzy nie lubią tej potwornej
new AClass[] { ... }
składni, oto trochę cukru:Użyj tej małej funkcji, jak chcesz:
źródło