Инициализировать массив ссылок во время объявления с помощью конструктора

У меня есть пользовательский объект Point, и параметры его конструктора указаны как Point(int x, int y).

Мне нужен массив из десяти различных точек, и каждая точка должна быть инициализирована до позиции (13, 27) с помощью конструктора.

Point[] points = new Point[10];
for (Point point : points) {
    point = new Point(13, 27);
}

Мне не нравится тот факт, что между первой строкой и второй строкой у меня есть массив nulls.

Могу ли я как-то объявить и инициализировать массив ссылок с помощью моего конструктора, используя одну строку?

Следующее работает, но мы видим проблемы с ним:

Point[] points = new Point[] {
    new Point(10, 10),
    new Point(10, 10),
    new Point(10, 10),
    /// <7 more points omitted>
};

Меня также интересует решение с List, например ArrayList.

В С++ я бы сделал, например: std::vector<Point> points{10, Point{13, 27}};.

Редактировать: мне нужно, чтобы мой массив содержал ссылки на 10 различных (но равных) Point объектов.


person weno    schedule 27.06.2020    source источник
comment
Отвечает ли это на ваш вопрос? Как инициализировать все элементы массива любым конкретным значением в java   -  person Sabareesh Muralidharan    schedule 27.06.2020
comment
@SabareeshMuralidharan К сожалению, я не имею дело с примитивами.   -  person weno    schedule 27.06.2020
comment
Может ли это помочь Point[] points = new Point[10]; Arrays.fill(точки, новая точка(13, 27));   -  person Sabareesh Muralidharan    schedule 27.06.2020
comment
но мы видим проблемы Какие проблемы вы видите?   -  person Joni    schedule 27.06.2020
comment
@Джони Повторение?   -  person Jakob Em    schedule 27.06.2020
comment
Требуются ли вам 10 различных объектов Point (чтобы позже вы могли изменять каждый независимо друг от друга) или достаточно 10 ссылок на один и тот же объект Point?   -  person Ole V.V.    schedule 27.06.2020
comment
10 различных ссылок.   -  person weno    schedule 27.06.2020


Ответы (2)


Вы можете использовать потоки Java для создания массива:

Point[] points = Stream.generate(() -> new Point(13,27)).limit(10).toArray(Point[]::new);
person Jakob Em    schedule 27.06.2020

Изменить. Вам требуется 10 различных объектов. Вы можете использовать потоковое решение Джейкоба Эма или от Гови С. Или, если вы можете временно жить с массивом, содержащим значения null:

    Point[] points = new Point[10];
    Arrays.setAll(points, index -> new Point(13, 27));

Мне кажется, что удержание nulls до инициализации не так уж плохо, и за кулисами это происходит и в потоковых решениях.

Мой первоначальный ответ дал вам массив из 10 ссылок на один и тот же объект Point. Возможно, это не тот код, который можно было бы сразу увидеть для задачи, но я думаю, что он хорошо читается:

    Point[] points = Collections.nCopies(10, new Point(13, 27)).toArray(new Point[0]);

Поскольку Java 11 еще немного понятнее:

    Point[] points = Collections.nCopies(10, new Point(13, 27)).toArray(Point[]::new);

Мне также кажется, что это похоже на ваш способ С++.

person Ole V.V.    schedule 27.06.2020