Инициализиране на масив от препратки по време на декларация с конструктор

Имам персонализиран обект 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.

В C++ бих направил например: 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
@Joni Повторение?   -  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 отделни обекта. Можете да използвате решението за поток на Якоб Ем или този от Govi ​​S. Или ако можете да живеете с масива, съдържащ 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);

Също така ми се струва, че е подобен на вашия C++ начин.

person Ole V.V.    schedule 27.06.2020