Reports any chains of if-else statements all of whose conditions are instanceof expressions or class equality expressions (e.g. comparison with String.class). Such constructions usually indicate a failure of object-oriented design, which dictates that such type-based dispatch should be done via polymorphic method calls rather than explicit chains of type tests.

Example:

  double getArea(Shape shape) {
    // Warning: abstraction failure. 
    // It would be better to declare a getArea() abstract method in the shape interface
    // and implement it in every inheritor.
    if (shape instanceof Point) {
      return 0;
    }
    if (shape instanceof Circle) {
      return Math.PI * Math.pow(((Circle) shape).radius(), 2);
    }
    if (shape instanceof Rectangle) {
      return ((Rectangle) shape).width() * ((Rectangle) shape).height();
    }
    throw new IllegalArgumentException();
  }

Use the checkbox below to ignore instanceof expressions on library classes.