Можно ли в классе модели данных хранить несколько списков для абстрактного объекта и его потомков? - PullRequest
0 голосов
/ 31 октября 2018

Я тестирую свои знания Java и навыки ООП. Проект, над которым я сейчас работаю, имеет класс модели одноэлементных данных, который использует структуру данных ArrayList.

public class FundingRequestData {
    private ArrayList<FundingRequest> fundingRequests;

    private static FundingRequestData instance = new FundingRequestData();

    public static FundingRequestData getInstance() { return instance; }

    public FundingRequestData() {
        this.fundingRequests = new ArrayList<>();
    }

    public FundingRequestData(ArrayList<FundingRequest> fundingRequests) {
        this.fundingRequests = fundingRequests;
    }

    public void add(FundingRequest newFundingRequest) {
        this.fundingRequests.add(newFundingRequest);
    }

    public ArrayList<FundingRequest> getFundingRequests() {
        return fundingRequests;
    }
}

ArrayList содержит объекты типа FundingRequest, которые на самом деле являются абстрактными объектами с двумя конкретными подклассами FixedFundingRequest, TrackerFundngRequest, унаследованными от него. Эти два объекта подкласса оба загружаются в ArrayList, так как мне нужно удобное хранилище для всех FundingRequest объектов.

Однако мне также нужно обращаться к объектам подкласса по отдельности, и, например, может быть случай, когда будет крайне неэффективно проходить по одному ArrayList для поиска FixedFundingRequest объектов, если подавляющее большинство являются TrackerFundingRequest объектами.

Решение, которое я представляю, состоит в том, чтобы добавить код, чтобы у класса FundingRequestData был не один, а три объекта ArrayList, чтобы обеспечить более эффективный поиск, когда я ищу конкретного потомка класса FundingRequest:

public class FundingRequestData {
    private ArrayList<FundingRequest> fundingRequests;
    private ArrayList<FixedFundingRequest> fixedFundingRequests;
    private ArrayList<TrackerFundingRequest> trackerFundingRequests;

    private static FundingRequestData instance = new FundingRequestData();

    public static FundingRequestData getInstance() { return instance; }

    public FundingRequestData() {
        this.fundingRequests = new ArrayList<>();
        this.fixedFundingRequests = new ArrayList<>();
        this.trackerFundingRequests = new ArrayList<>();
    }

    public FundingRequestData(ArrayList<FundingRequest> fundingRequests) {
        // loop through objects & use add methods to initialise arrays
    }

    public void add(FixedFundingRequest newFundingRequest) {
        this.fundingRequests.add(newFundingRequest);
        this.fixedFundingRequests.add(newFundingRequest);
    }

    public void add(TrackerFundingRequest newFundingRequest) {
        this.fundingRequests.add(newFundingRequest);
        this.trackerFundingRequests.add(newFundingRequest);
    }

    public ArrayList<FundingRequest> getFundingRequests() {
        return fundingRequests;
    }

    public ArrayList<FixedFundingRequest> getFixedFundingRequests() {
        return fixedFundingRequests;
    }

    public ArrayList<TrackerFundingRequest> getTrackerFundingRequests() {
        return trackerFundingRequests;
    }
}

Из того, что я описал (и я могу предоставить больше информации, если этого недостаточно), может ли кто-нибудь помочь мне понять подводные камни в этом проекте, и что может быть лучше? Я не знаю, если этот вид дизайна обязательно осуждают, но это не кажется правильным. Опять же - без реализации все большего количества классов, я не знаю никакой альтернативы.

...