以下是instanceof的使用是不好的编程

时间:2017-07-29 19:00:03

标签: java

我正在尝试下面的一段代码。

 public void doSomething(){

           makeMethodCall(car);

           statement1......
           statement2......

         makeMethodCall(bike);

            statement3......

         makeMethodCall(bicycle);

    }


   private void makeMethodCall(Object obj){
        if(obj instanceof Car){
                 obj.drive();
        }
          if(obj instanceof Bike){
                 obj.drive();
        }
            if(obj instanceof Bicycle){
                 obj.drive();
        }
        // There are many if loops
      }

我在想我正在做一些错误的活动。无论如何,我可以使用lamba表达式来处理这个编程。我是java8的新手,我发现使用lambda表达式很棘手。

3 个答案:

答案 0 :(得分:7)

在绝大多数情况下,声明一个接受Object作为参数的函数是不好的做法,当然是在手头的情况下。

CarBikeBicycle应该从公共抽象基类Vehicle派生,它定义了一个抽象方法drive()。然后在每个派生类中重写此方法。

因此,您可以makeMethodCall( object )代替vehicle.drive()

答案 1 :(得分:1)

是的,这很糟糕。从参数列表中猜出方法想要的东西并不容易。您可以改为创建一个名为“Vehicle”的界面:

public interface Vehicle {
    public void drive();
}

让每个类实现它,这也迫使对象实现驱动功能:

public class Bike implements Vehicle { ... }

然后你可以使用车辆的驱动方法。如果所有对象之间的驱动方法相同,那么您可以使用抽象的Vehicle类进行相同的操作。

答案 2 :(得分:1)

Java中的所有方法都是虚拟的。 我想,你应该使用接口:

interface Driveable {
  void drive();
}

class Car implements Driveable {
@Override
void drive() {
   System.out.println("Car drive");
}
}
class Bike implements Driveable {
@Override
void drive() {
   System.out.println("Bike drive");
}
}
class Bicycle implements Driveable {
@Override
void drive() {
   System.out.println("Bicycle drive");
}
}

现在您不需要makeMethodCall方法,只需编写

即可
void doSomething(Driveable driveable) { 
  driveable.drive();
}