Синтаксис инициализации массива, если не в объявлении

Я могу написать:

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.

Ответ 1

Почему это заблокировано Java?

Вам придется спросить дизайнеров Java. Для ограничения может быть какая-то тонкая грамматическая причина. Обратите внимание, что некоторые из конструкций создания/инициализации массива не были в Java 1.0, а (IIRC) были добавлены в Java 1.1.

Но "почему" несущественно... существует ограничение, и вам нужно жить с ним.

Я знаю, как обойти это, но время от времени это будет проще.

Вы можете написать это:

AClass[] array;
...
array = new AClass[]{object1, object2};

Ответ 2

Я попытаюсь ответить на вопрос, почему: массив Java очень прост и рудиментарнее по сравнению с такими классами, как ArrayList, которые более динамичны. Java хочет знать во время объявления, сколько памяти должно быть выделено для массива. ArrayList намного более динамичен, и его размер может меняться со временем.

Если вы инициализируете свой массив длиной в два, а затем, как оказалось, вам понадобится три, вам нужно выбросить то, что у вас есть, и создать целый новый массив. Поэтому ключевое слово "новое".

В первых двух примерах вы указываете время объявления, сколько памяти выделяется. В вашем третьем примере имя массива становится указателем на ничего вообще, и поэтому при его инициализации вы должны явно создать новый массив для выделения нужного объема памяти.

Я бы сказал, что (и если кто-то знает лучше, пожалуйста, исправьте меня) первый пример

AClass[] array = {object1, object2}

на самом деле означает

AClass[] array = new AClass[]{object1, object2};

но то, что сделали разработчики Java, заключалось в том, чтобы быстрее создать запись, если вы создадите массив во время объявления.

Предлагаемые обходные пути хороши. Если время или использование памяти имеют решающее значение во время выполнения, используйте массивы. Если это не критично, и вам нужен код, который легче понять и работать, используйте ArrayList.

Ответ 3

Я не могу ответить на причину.

Но если вы хотите что-то динамическое, то почему бы вам не рассмотреть Collection ArrayList.

ArrrayList может быть любого типа объекта.

И если в качестве принуждения вы хотите использовать его как массив, вы можете использовать метод toArray() на нем.

Например:

            ArrayList<String> al = new ArrayList<String>();
            al.add("one");
            al.add("two");
            String[] strArray = (String[]) al.toArray(new String[0]);

Надеюсь, это поможет вам.

Ответ 4

Для тех из вас, кому не нравится этот чудовищный синтаксис new AClass[] { ... }, здесь немного сахара:

public AClass[] c(AClass... arr) { return arr; }

Используйте эту небольшую функцию по своему усмотрению:

AClass[] array;
...
array = c(object1, object2);