Java编码风格,局部变量vs重复方法调用

时间:2010-02-09 10:44:06

标签: java coding-style

我更喜欢使用局部变量而不是多次调用同一个方法。

/*
 * 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();
}
  • 我相信第一种方式会更快一点
  • 我认为第二种方式违反了DRY原则
  • 我发现第一种方式更易读,更容易调试(......可以忽略不计,因为我可以跨过)
  • 我不想处理更改对象状态的可能性

您更喜欢哪个?为什么?

7 个答案:

答案 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上的抽象(或受保护)方法。如果这是您无法修改的代码,请使用组合将其放在代码库中的接口内,这样您就不必使用您正在使用的库的糟糕设计来污染其余代码。这绝对是代码味道。请参阅福勒重构书中的“用多态性替换条件”。