Java — Передача значений в конструктор без ввода значений по одному

#java #list #class #constructor

Вопрос:

Мне нужно создать список протекторов, в котором будут заполнены значения, которые я буду извлекать по одному из файла Excel.

Класс, о котором идет речь:

 public class TReadings {
long zone1;
long zone2;
.
.
.
long zone99;

// constructor
public TReadings (long zone1, long zone2 ... long zone99){
this.zone1=zone1;
.
.
.
}
}
 

Поскольку для этого конструктора существует 99 параметров, есть ли способ передать значения(или список) конструктору без ввода всех значений по одному?

Комментарии:

1. Массивы, векторы, списки … любая коллекция. Всегда думайте о них в первую очередь, когда вы обнаружите, что пишете thing1, thing2 и т. Д.

2. Варарги? Вы, кажется, намекнули на них 😉

3. Вы можете попробовать отражение

4. Независимо от того, как вы передаете значения, наличие 99 полей в классе-это запах кода.

5. похоже, здесь можно использовать хэш-карту. Нет необходимости в конструкторе/классе.

Ответ №1:

 public class TReadings {
    
    List<Long> zones;

    public TReadings(List<Long> zones) {
        this.zones = zones;
    }      
}

//and to call it
List<Long> zones = new ArrayList<>();
zones.add(1);
//...
zones.add(99);
TReadings readings = new TReadings(zones);
 

Ответ №2:

Вы можете использовать переменные аргументы.

 public class TReadings {
    List<Long> zoneList = new ArrayList<Long>();
    
    public TReadings(Long... values) {
        for (Long val : values)
            zoneList.add(val);
    }
}
 

затем вы можете вызвать его, используя по количеству аргументов:

 new TReadings(1L, 23L);
new TReadings(1L, 22L, 44L, 87L, 5L);
new TReadings(99L);
 

Ответ №3:

Если TReadings это находится под вашим контролем, т. Е. вы можете изменить его, вы можете просто определить такой конструктор:

 public class TReadings {
   List<Long> zoneList;

   TReadings(List<Long> zoneList){
      this.zoneList = zoneList;
   }
}
 

Комментарии:

1. Будь осторожен. Когда кто-то передает список конструктору подобным образом, список не копируется, но его ссылка сохраняется. Изменения в исходном списке также приводят TReadings к изменению!

2. Правильно, функция, вызывающая конструктор, должна перед каждым его вызовом (точнее, в данном случае перед чтением новых значений) создавать новый список

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