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

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

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

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

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

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

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

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

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

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

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

 AClass[] array = {object1, object2} 

фактически означает

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

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

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

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

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

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

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

Например:

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

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

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

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

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

 AClass[] array; ... array = c(object1, object2); 
  • Новый вызывает конструктор по умолчанию в C ++?
  • Могу ли я передать массив в качестве аргументов метода с переменными аргументами в Java?
  • Как создать правильный JSONArray в Java с помощью JSONObject
  • Доступ к элементам элементов в JSONArray с помощью Java
  • Структуры данных .NET: ArrayList, List, HashTable, Словарь, SortedList, SortedDictionary - Скорость, память и когда использовать их?
  • Как я могу объединить два массива в Java?
  • Java: BufferedImage для байтового массива и обратно
  • Как распечатать полный массив NumPy?
  • Когда использовать HashMap поверх LinkedList или ArrayList и наоборот
  • получение размера массива из указателя c ++
  • Тип узла выражения LINQ «ArrayIndex» не поддерживается в LINQ to Entities
  • Давайте будем гением компьютера.