Я могу написать:
AClass[] array = {object1, object2}
Еще я могу написать:
AClass[] array = new AClass[2];
...
array[0] = object1;
array[1] = object2;
но я не могу написать:
AClass[] array;
...
array = {object1, object2};
Почему это заблокировано Java?
Я знаю, как это обойти, но время от времени было бы проще.
Например:
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;
}
}
}
Этот простой вопрос беспокоит меня с тех пор, как я научился играть с массивами на Java.
Ответы:
Спросите у Java-дизайнеров. Для ограничения может быть какая-то тонкая грамматическая причина. Обратите внимание, что некоторые конструкции создания / инициализации массивов отсутствовали в Java 1.0, а (IIRC) были добавлены в Java 1.1.
Но «почему» несущественно ... ограничение есть, и с ним нужно жить.
Вы можете написать это:
AClass[] array; ... array = new AClass[]{object1, object2};
источник
{o1()}
было ли правильное выражение{o1();}
допустимым блоком операторов. Парсер должен добраться до '}' или ';' прежде чем он сможет различить два случая. Грамматический вопрос совсем не тонкий !!Я попытаюсь ответить на вопрос, почему: массив Java очень прост и рудиментарен по сравнению с классами, такими как ArrayList, которые более динамичны. Java хочет знать во время объявления, сколько памяти следует выделить для массива. ArrayList намного более динамичен, и его размер может меняться со временем.
Если вы инициализируете свой массив длиной два, а позже выясняется, что вам нужна длина трех, вам придется выбросить то, что у вас есть, и создать совершенно новый массив. Поэтому ключевое слово «новое».
В ваших первых двух примерах вы указываете во время объявления, сколько памяти нужно выделить. В вашем третьем примере имя массива становится указателем вообще ни на что, и поэтому, когда он инициализируется, вы должны явно создать новый массив, чтобы выделить правильный объем памяти.
Я бы сказал, что (и если кто-то знает лучше, поправьте меня) первый пример
на самом деле означает
AClass[] array = new AClass[]{object1, object2};
но разработчики Java сделали более быстрый способ его записи, если вы создадите массив во время объявления.
Предлагаемые обходные пути хороши. Если использование времени или памяти критично во время выполнения, используйте массивы. Если это не критично, и вам нужен код, который легче понять и с которым работать, используйте ArrayList.
источник
{
и}
... точно так же, как это делается для разрешенных форм инициализатора.Я не могу ответить, почему.
Но если вам нужно что-то динамическое, почему бы вам не рассмотреть Collection ArrayList.
ArrrayList может быть любого типа объекта.
И если в качестве принуждения вы хотите, чтобы он был массивом, вы можете использовать для него метод toArray ().
Например:
ArrayList<String> al = new ArrayList<String>(); al.add("one"); al.add("two"); String[] strArray = (String[]) al.toArray(new String[0]);
Надеюсь, это может вам помочь.
источник
Для тех из вас, кому не нравится этот чудовищный
new AClass[] { ... }
синтаксис, вот немного сахара:public AClass[] c(AClass... arr) { return arr; }
Используйте эту маленькую функцию как хотите:
источник