2016-03-30 5 views
2

Есть ли способ определить значение по умолчанию для объекта в массиве, который будет инициализирован?Инициализация объекта в массиве со значением по умолчанию - java

Таким же образом, что примитивные типы инициализируются при объявлении массива из них:

int[] myIntArray = new int[5]; // we now have an array of 5 zeroes 
char[] myCharArray = new char[2]; // an array in which all members are "\u0000" 

т.д.

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

Я не смог найти что-либо релевантное онлайн, ближе всего я получил использовать Arrays.fill(myArray, new MyObject()) после инициализации массива (который фактически просто создает один объект и заполняет массив указателями на него) или просто использует цикл переходить через массив и инициализировать каждую ячейку.

спасибо!

EDIT: Я понял, что это относится не только к массивам, но и к объявлению объектов вообще и по умолчанию их автоматически присваивает значение/инициализировать.

+1

Такое поведение также определить в [JLS] (https://docs.oracle. ком/JavaSE/данные/JLS/SE7/html/JLS-4.html # ПСБ-4.12.5). – Maroun

+3

Нет встроенного решения, а не так, что Java будет обнулить массив для вас, когда он будет выделен. Довольно приятное решение: 'Stream.generate (() -> new MyObject()). Limit (5) .toArray (MyObject [] :: new)' – Cardano

+0

Вы могли бы подробно рассказать о том, что именно это делает? благодаря! –

ответ

6

Java-8 способ:

MyObject[] arr = Stream.generate(() -> new MyObject()) 
    .limit(5) 
    .toArray(MyObject[]::new); 

Это создаст бесконечное Stream объектов, производимых поставщиком () -> new MyObject(), ограничить поток к общей желаемой длины, и собрать его в массив.

Если вы хотите установить некоторые свойства объекта или что-то, вы могли бы иметь более активное участие поставщика:

() -> { 
    MyObject result = new MyObject(); 
    result.setName("foo"); 
    return result; 
} 
1

Делайте это так, вы можете инициализировать массив при объявлении его:

int[] myIntArray = {0, 0, 0,0,0}; 
char[] myCharArray = { 'x', 'p' }; 

вы могли бы, конечно, сделать:

int[] myIntArray = new int[5]; 

и тому в цикле набора всех индексов к исходному значению. .. но это может занять некоторое время, если массив больше ...

Edit:

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

Пример:

public class SOFPointClass { 

private int x; 
private int y; 

    public SOFPointClass(int x, int y) { 
    this.x = x; 
    this.y = y; 
} 

    // test 
    public static void main(String[] args) { 
     SOFPointClass[] pointsArray = { new SOFPointClass(0,0) , new SOFPointClass(1,1)}; 
    } 
} 
+0

Я не думаю, что это то, что он хочет. Он говорит об объектах. –

+1

Я действительно говорю об объектах. Я дал массивы int и char в качестве примеров того, что происходит с примитивными типами, и это то, что я хочу делать с объектом. (И я женщина, просто говорю :)) –

+0

Ох, я понял, пожалуйста, взгляните на обновление в ответ с SOFPointClass –

0

Я не вижу путь, который Java обеспечивает, чтобы сделать это.

Мое предложение будет определять функцию, чтобы сделать это.

Object[] initialize(Class aClass, int number) throws IllegalAccessException, InstantiationException { 
    Object[] result = new Object[number]; 
    for (int i = 0; i < number; ++i) { 
     result[i] = aClass.newInstance(); 
    } 
} 

Тогда называют его Object[] arr = initialize(YourClass.class, 10)

0

В Java, массив инициализируется со значением по умолчанию для этого типа. Например, значение int по умолчанию равно 0. Значением по умолчанию для ячеек массива объектов является null, поскольку ячейки массива содержат только ссылки на слот памяти, содержащий сам объект. Значение по умолчанию равно null. Чтобы заполнить его другим значением по умолчанию, вы должны вызвать Arrays.fill(), как вы упомянули.

Object[] arr=new Object[2]; 
Arrays.fill(arr, new Object()); 
+0

спасибо, но, как я уже упоминал, насколько мои тесты показали, это заполняет массив указателями на то же самое новый объект, который не полезен (по крайней мере, в этом случае ...) –

+0

Хорошо, я получил то, что вам нужно .. так что либо цикл, либо на Java 8 используют поток, описанный выше –

0

Насколько я знаю, нет никакого способа сделать то, что вы хотите с просто Java (то есть может быть внешняя библиотека, я не знаю о).

Я бы взял хит и петлю над массивом.Нечто подобное должно работать:

myObject[] array = new myObject[5]; 

for (int i = 0; i < array.length; i++) { 
    array[i] = new myObject(); 
} 

Вы также мог бы сократить это с помощью лямбды, как Cardano говорил в своем ответе.