Выяснение конкретной реализации из суперкласса

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

abstract class Animal {
    String type;
}

class Dog extends Animal {
    public Dog() { type = "DOG"; }
}

 class Cat extends Animal {
    public Cat() { type = "CAT"; }
 }

Сейчас по всей базе кодов существует множество методов, которые принимают List в качестве входных данных, поэтому я не хочу нарушать эти интерфейсы. Во многих из этих методов список обычно повторяется, и некоторая обработка выполняется в зависимости от атрибута "type" объекта Animal для каждого объекта в списке. Для этого я должен делать уродливые откаты от животных до кошек или собак. Пример:

class Processor {
    public void process(List<Animal> animals) {
        for(Animal animal: animals) {
            if(animal instanceof Dog) { // or if type.equals("DOG")
                Dog dog = (Dog) animal;
                dog.bark();
            } else if {....}
        }
    }

}

Мне было интересно, есть ли другой способ сделать это. Какие-нибудь мысли?

1 ответ

Если вы можете улучшить свои Animal класс, чтобы лучше охватить ожидаемое поведение объектов этого типа, это должно быть первым делом.

Кроме этого, я мало что могу предложить по данной информации.

Другие вопросы по тегам