Я изо всех сил пытаюсь использовать instanceof() в некоторых своих кодах. Этот надуманный пример несколько отражает проблему.Избегайте использования 'instanceof'
Class Meat extends Food;
Class Plant extends Food;
Class Animal;
Class Herbivore extends Animal
{
void eat(Plant food);
}
Class Carnivore extends Animal
{
void eat(Meat food);
}
Class Omnivore extends Animal
{
void eat(Food food);
}
Class Zoo
{
List<Animals> animals;
void receiveFood(Food food)
{
// only feed Plants to Herbivores and Meat to Carnivores
// feed either to Omnivores
}
}
Herbivores интересовались только растениями, плотоядными животными только в мясе и овощах обоих. Когда зоопарк получает Пищу, имеет смысл попытаться накормить пищу для животных, которые едят этот тип пищи.
Я подумал о нескольких решениях, но все, похоже, зависит от использования instanceof()
, и мои различные рефакторинги просто перемещают его.
(1) Я мог бы реализовать eat(Food food)
в животных и каждый подкласс может игнорировать пищу, что она не ест, но это неэффективно и требует, чтобы каждое животное подкласса использовать instanceof()
, чтобы проверить тип питания.
(2) Я мог бы хранить три коллекции животных в Зоопарке в зависимости от типа пищи, которую они едят, но все равно придется использовать instanceOf()
, чтобы проверить тип пищи, чтобы посмотреть, какую коллекцию она кормит. По крайней мере, это было бы более эффективно, так как я бы не кормил пищей Животные, которые не будут есть.
Я подумал о некоторых других подходах, но опять же они просто передают instanceof()
доллар.
Любые предложения? Или это (2, по крайней мере) было бы приемлемым использованием instanceof()
?
Может быть, вы должны смотреть в общих методов? Таким образом, вы могли бы указать, что у Животного есть способ есть (T extends Food), а Herbivore будет набираться как Plant? Что-то в этом роде. –
Возможный дубликат [Используется ли это «экземпляр» Оператор считается плохой дизайн?] (Http://stackoverflow.com/questions/8841577/is-this-use-of-the-instanceof-operator-considered-bad- дизайн) –
Идеальный кандидат для шаблона посетителя – bluesman