Как избежать уныния при использовании списка элементов подкласса в Java - PullRequest
1 голос
/ 24 апреля 2020

У меня есть абстрактный класс A и классы B и C. Классы B и C расширяют A. Мне нужно держать B и C в списке вместе, скажем, List. Однако B и C имеют уникальные методы, поэтому не все элементы в Списке могут использоваться для вызова определенных методов , если только я не опускаю вниз , что считается запахом дизайна.

Мне нужно сохранить B и C в одном списке, потому что я хочу отсортировать их на основе их общих атрибутов, которые я могу. Сохраняет ли они их в том же списке своего родительского типа, а затем снижает рейтинг в этой ситуации?

1 Ответ

1 голос
/ 24 апреля 2020

Мне нужно сохранить B и C в одном списке, потому что я хочу отсортировать их на основе их общих атрибутов, которые я могу.

Поскольку требуется, чтобы список сортировался со смешанными типами B, C, оба расширяющих A, для вызова их не унаследованных методов, у вас нет выбора, кроме как использовать List<A>, содержащий все типы.

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

for (A item: sortedList) {
    if (item instanceof B) {
        Whatever fieldB = ((B) item).getFieldB();  // using non-inherited method of B
    } else if (item instanceof C) {
         Whatever fieldC = ((C) item).getFieldC();  // using non-inherited method of C
    } else {
         // either only A or anything different that extends A
    }
}

Как Java 14 благодаря JEP 305: сопоставление с образцом, например , такая вещь становится менее многословной:

for (A item: sortedList) {
    if (item instanceof B b) {
        Whatever fieldB = b.getFieldB();  // using non-inherited method of B
    } else if (item instanceof C c) {
        Whatever fieldC = c.getFieldC();  // using non-inherited method of C
    } else {
        // either only A or anything different that extends A
    }
}
...