Olegatorapp
@Olegatorapp
Java/Android dev

Как получить параметры полей класса без использования рефлексии?

Всем привет, есть такие требования к архитектуре метода:
Реализуйте методы fillAllFields и getAllFields во всех классах-устройствах так, что бы сначала в массиве шли поля класса AbstractDevice, потом дочерних классов. При реализации не забывайте, что можно вызывать родительские реализации этого же метода. Реализуйте методы fillAllFields и getAllFields так, что бы их не нужно было менять, если в родительских или дочерних классах будет меняться количество или состав полей, и даже если родительский класс будет заменён на другой.

Всё бы ничего, но тут нежелательно использовать рефлексию, которая значительно бы упростила это дело. Я вычитал, что можно как-то использовать Generics, но не могу разобраться, как прикрутить его сюда.

FillableEntity
import 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;
        }
    }

}
Device
import 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);
}
Поля класса AbstractDevice
public 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 и мои попытки реализовать методы эти (реализация неправильная, т.к. она привязана к конкретной структуре полей класса):
Battery
import 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;
    }
}
  • Вопрос задан
  • 383 просмотра
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
Я подозреваю, что можно сделать так - в методе fillAllFields можно позвать super.fillAllFields. Затем позвать super.getAllFields().getSize(), и заполнить свои поля, начиная с позиции, где закончились поля родителя.
Метод getAllFields - ещё проще, надо позвать super.getAllFields() и в этот массив в конец добавить свои поля.
Кажется, что это будет работать для любой иерархии.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы