我正在尝试下面的一段代码。
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表达式很棘手。
答案 0 :(得分:7)
在绝大多数情况下,声明一个接受Object
作为参数的函数是不好的做法,当然是在手头的情况下。
Car
,Bike
和Bicycle
应该从公共抽象基类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();
}