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

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

/* * 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原则
  • 我发现第一种方式更易读,更容易调试(……可以忽略不计,因为我可以跨过)
  • 我不想要处理改变对象状态的可能性

你更喜欢哪个?为什么?

是的,第一个肯定更好。 我永远不会选择第二种方法。 但是你应该考虑更多地使用多态。 依靠如此沉重的instanceof并不是优秀的OO设计。

出于你提到的所有原因,我更喜欢第一个版本。 特别是(只是为了说明你的第四点),这意味着你肯定会得到一致的结果……如果getVehicle()在第一次调用时返回Car ,那么你可能会在第二个版本中获得可怕的令人讨厌的结果,然后是Bike在第二…

性能方面并没有打扰我(例如,我会愉快地重复调用List.size() )但可读性,一致性和非重复性都更为重要。 从本质上讲,第一个片段传达了“获取价值,然后使用它”的想法,比第二个更有效。

是的,我和你在一起……是否有人向你推荐第二种forms?

我通常不喜欢引入额外的变量,因为每个添加状态使得方法更复杂。 但即使我说你的例子中也有必要,因为变量取代了4个相同代码的重复。

变量绝对应该是final

我同意,但我也试图在课堂设计层面减少’instanceof’的使用。

我个人认为第一个更干净。 但是,如果被调用的方法不是计算密集型的,那么它并不重要。

可能第二个更快一点(如果你使用Java 1.6)因为在第一个例子中你制作了变量的副本,而java VM可能会在两个例子中内联函数调用。 当然,优化绝不是这样的调用的参数。 编译器做了很多优化,我们不应该打扰(通常它只会降低速度,因为我们不太了解它)。

至于到目前为止回答这个问题的每个人,我绝对更喜欢第一种风格。 它可以更清洁:

 Vehicle vehicle = person.getVehicle() if (vehicle instanceof Car) { ((Car) vehicle).openSunroof(); } else if (vehicle instanceof Bike) { ((Bike) vehicle).foldKickstand(); } 

两个例子都需要一些工作。 尝试将行为推送到Vehicle上的抽象(或受保护)方法。 如果这是您无法修改的代码,请使用组合将其放在代码库中的接口内,这样您就不必使用您正在使用的库的糟糕设计来污染其余代码。 这绝对是一种代码味道。 请参阅Fowler重构书中的“用多态性替换条件”。