Как получить конкретный объект из ArrayList <абстрактный класс>? - PullRequest
0 голосов
/ 02 мая 2019

Итак, у моего приложения есть класс клиентов, у которого есть ArrayList.Так, например, у некоторых клиентов будет страхование путешествий, а у некоторых - страхование жилья и страхование автомобилей.

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

В моем графическом интерфейсе я хочу, чтобы на одной странице отображалась страховка путешествия, а на другой - страховка лодки от того же клиента.Моя проблема в том, что, когда я получаю свой arraylist, я не знаю порядок страховок и в результате я сделал метонды в моем классе клиентов

class Customer {
    private String name;
    //and so on

    private ArrayList<AbstractInsurance> list;

    public CarInsurance getCarInsurance () {
        for (insurance i : list) {
            if (i.getName().equals("Carinsurance") {
                returnt (CarInsurance) i;
            }
        }
    }
}

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

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 02 мая 2019

Это был бы способ сделать это:

class Customer {
    private String name;
    //and so on

    private List<AbstractInsurance> list;

    public Optional<CarInsurance> getCarInsurance () {
        return list.stream()
                   .filter(insurance -> insurance instanceof CarInsurance)
                   .findFirst();        
    }
}

Затем проверка, если Optional.isPresent ().

Но, скорее, я бы переосмыслил решение, как предложено использовать Карту, изменив AbstractInsurance, чтобы включить Enum с типом страхования ...

0 голосов
/ 02 мая 2019

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

enum InsuranceType {
    CAR,
    BOAT,
    HOME
    // and so on...
}

И тогда я бы сохранял объект страховки с перечислением всопоставление в классе Customer или аналогичном, так как оно для каждого клиента

Map<InsuranceType, AbstractInsurance> insurances = new HashMap<>();

и метод доступа к ним

public AbstractInsurance getInsurance(InsuranceType type) {
    return insurances.get(type);
}

Этот метод, конечно, может возвращать ноль, но вы должны его обработать, когдавызывая его, потому что его нельзя избежать.

Если вы хотите, вы также можете добавить удобные методы для получения определенной страховки, например

public CarInsurance getCarInsurance() {
    return (CarInsurance) insurances.get(InsuranceType.CAR);
}

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

public Optional<AbstractInsurance> getInsurance(InsuranceType type) {
    return Optional.of(insurances.get(type));
}

public Optional<CarInsurance> getCarInsurance() {
    return Optional.of((CarInsurance) insurances.get(InsuranceType.CAR));
}
...