Is using the instanceof
keyword against the essence of object oriented programming
?
I mean is it a bad programming practice?
I read somewhere that us
There are many good answers promoting virtual methods, but instanceof
has its uses as well. Imagine that you iterate over List<Event>
, to pick up all Urgent
objects. You might do it using isUrgent()
but I am not sure if it were necessarily more concise or readable. Also, isUrgent()
would require making Event
aware that its subclasses may possess the respective property, which might:
Event
belongs to some library that can not be modified.It's discouraged because people might use it to do something like this:
if( myAnimal instanceof Dog )
((Dog)myAnimal).bark();
else( myAnimal instanceof Cat )
((Cat)myAnimal).meow();
Instead, Animal
should have a speak()
method which Dog
and Cat
inherit. In proper OOP with polymorphism and dynamic binding, you would then simply do
myAnimal.speak();
However, there are some instances in which you must use instanceof
to determine the specific type of an object. Perhaps you have a list of Animals
in your house and the only ones you want to take out for a walk()
are the Dog
s. In that case you would iterate through your list and only walk()
the dogs.