Всем привет, есть такие требования к архитектуре метода:
Реализуйте методы fillAllFields и getAllFields во всех классах-устройствах так, что бы сначала в массиве шли поля класса AbstractDevice, потом дочерних классов. При реализации не забывайте, что можно вызывать родительские реализации этого же метода. Реализуйте методы fillAllFields и getAllFields так, что бы их не нужно было менять, если в родительских или дочерних классах будет меняться количество или состав полей, и даже если родительский класс будет заменён на другой.
Всё бы ничего, но тут
нежелательно использовать рефлексию, которая значительно бы упростила это дело. Я вычитал, что можно как-то использовать Generics, но не могу разобраться, как прикрутить его сюда.
FillableEntityimport java.util.List;
public interface FillableEntity {
void fillAllFields(List<Field> fields);
List<Field> getAllFields();
class Field {
Class type;
Object value;
public Field(Class type, Object value) {
this.type = type;
this.value = value;
}
public Class getType() {
return type;
}
public void setType(Class type) {
this.type = type;
}
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
}
}
Deviceimport java.util.Date;
public interface Device extends FillableEntity {
int getIn();
void setIn(int in);
String getType();
void setType(String type);
String getManufacturer();
void setManufacturer(String manufacturer);
String getModel();
void setModel(String model);
Date getProductionDate();
void setProductionDate(Date productionDate);
}
Поля класса AbstractDevicepublic abstract class AbstractDevice implements Device {
protected int in = 0;
protected String type;
protected String manufacturer;
protected String model;
protected Date productionDate;
private static final Logger LOG = Logger
.getLogger(AbstractDevice.class.getName());
/*
Геттеры и сеттеры дальше идут для них
*/
}
А это один из классов реализующий Device и мои попытки реализовать методы эти (реализация неправильная, т.к. она привязана к конкретной структуре полей класса):
Batteryimport java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class Battery<T> extends AbstractDevice implements Device {
protected int chargeVolume;
public int getChargeVolume() {
return this.chargeVolume;
}
public void setChargeVolume(int chargeVolume) {
this.chargeVolume = chargeVolume;
}
@Override
public void fillAllFields(List<Field> fields) {
Field f[] = new Field[fields.size()];
for (int i = 0; i < fields.size(); i++) {
f[i] = fields.get(i);
}
super.setIn(Integer.parseInt(f[0].getValue().toString()));
super.setType(null);
super.setManufacturer(String.valueOf(f[2].getValue()));
super.setModel(String.valueOf(f[3].getValue()));
super.setProductionDate((Date) f[4].getValue());
this.chargeVolume = (int) f[5].getValue();
}
@Override
public List<Field> getAllFields() {
List<Field> listField = new ArrayList<>();
listField.add(new Field(Integer.class, super.getIn()));
listField.add(new Field(String.class, super.getType()));
listField.add(new Field(String.class, super.getManufacturer()));
listField.add(new Field(String.class, super.getModel()));
listField.add(new Field(Date.class, super.getProductionDate()));
listField.add(new Field(Integer.class, this.chargeVolume));
Battery<T> battery = new Battery<T>();
return listField;
}
}