#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. Ну, это может быть основано на мнении, но я думаю, что конструктор должен убедиться, что состояние его экземпляра защищено от внешних изменений, а не вызывающий метод.