我更喜欢使用局部变量而不是多次调用同一个方法。
/*
* I prefer this
*/
Vehicle vehicle = person.getVehicle()
if (vehicle instanceof Car) {
Car car = (Car) vehicle;
car.openSunroof();
} else if (vehicle instanceof Bike) {
Bike bike = (Bike) vehicle;
bike.foldKickstand();
}
/*
* Rather than this
*/
if (person.getVehicle() instanceof Car) {
Car car = (Car) person.getVehicle();
car.openSunroof();
} else if (person.getVehicle() instanceof Bike) {
Bike bike = (Bike) person.getVehicle();
bike.foldKickstand();
}
您更喜欢哪个?为什么?
答案 0 :(得分:8)
出于你提到的所有原因,我更喜欢第一个版本。特别是(只是为了说明你的第四点),这意味着你肯定会获得一致的结果......如果getVehicle()
返回Car
,你可能会在第二个版本中得到可怕的令人讨厌的结果第一个电话,然后是第二个电话Bike
......
表演方面并没有打扰我(例如,我会愉快地反复调用List.size()
)但可读性,一致性和非重复性都更为重要。从本质上讲,第一个片段传达了“获取价值,然后使用它”的想法,比第二部分更有效。
是的,我和你在一起......是否有人向你推荐第二种形式?
答案 1 :(得分:3)
是的,第一个肯定更好。我永远不会选择第二种方法。
但你应该考虑更多地使用多态。如此沉重地依赖instanceof
不是好的OO设计。
答案 2 :(得分:2)
我通常不喜欢引入额外的变量,因为每个添加状态都会使方法变得更复杂。但即使我说你的例子中也有必要,因为变量取代了4个相同代码的重复。
但变量绝对应该是final
!
答案 3 :(得分:1)
我同意,但我也试图在课堂设计层面减少'instanceof'的使用。
答案 4 :(得分:1)
我个人认为第一个更干净。但是,如果被调用的方法不是计算密集型的,那么它并不重要。
可能第二个更快一点(如果你使用Java 1.6)因为在第一个例子中你制作了一个变量的副本,而java VM很可能在两个例子中内联函数调用。当然,优化绝不是这样的调用的参数。编译器做了很多优化,我们不应该打扰(通常它只会降低速度,因为我们不太了解它)。
答案 5 :(得分:1)
到目前为止,每个回答这个问题的人,我都非常喜欢第一种风格。它可以更清洁:
Vehicle vehicle = person.getVehicle()
if (vehicle instanceof Car) {
((Car) vehicle).openSunroof();
} else if (vehicle instanceof Bike) {
((Bike) vehicle).foldKickstand();
}
答案 6 :(得分:1)
这两个例子都需要一些工作。尝试将行为推送到Vehicle上的抽象(或受保护)方法。如果这是您无法修改的代码,请使用组合将其放在代码库中的接口内,这样您就不必使用您正在使用的库的糟糕设计来污染其余代码。这绝对是代码味道。请参阅福勒重构书中的“用多态性替换条件”。