热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java编程规范:局部变量使用与方法调用重复性分析

在Java编程中,为了提高代码的可读性和执行效率,建议优先使用局部变量来存储方法的返回值,而不是多次调用同一个方法。这样不仅可以减少方法调用的开销,还能避免潜在的性能问题。此外,使用局部变量还可以增强代码的可维护性和调试便利性。

I prefer to use local variables rather than multiple calls to the same method.

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

/*
 * 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();
}
  • I believe that the first way is going to perform a tiny bit faster
  • 我相信第一种方法会更快一点。
  • I think the second way violates the DRY principle
  • 我认为第二种方法违反了干原则
  • I find the first way more readable and easier to debug (... OK negligible because I could step over)
  • 我发现第一种方法可读性更好,而且更容易调试(……)可以忽略,因为我可以跨过去)
  • I don't want to have to deal with the possibility of changed object state
  • 我不想讨论对象状态改变的可能性

Which do you prefer and why?

你喜欢哪一种,为什么?

7 个解决方案

#1


3  

Yeah the first one is definitely better. I would never go for the second method. But you should think of using polymorphism more. Relying on instanceof so heavyly is not good OO design.

第一个肯定更好。我永远不会采用第二种方法。但是您应该考虑更多地使用多态性。依赖这样重量级的实例不是好的OO设计。

#2


8  

I prefer the first version for all the reasons you've mentioned. In particular (just to spell out your fourth point), it means you're definitely going to get consistent results... you could get horribly nasty results with the second version if getVehicle() returned a Car on the first call, then a Bike on the second...

由于你提到的所有原因,我更喜欢第一个版本。特别地,这意味着你肯定会得到一致的结果……如果getVehicle()在第一次调用时返回一辆汽车,然后在第二次调用时返回一辆自行车,那么在第二个版本中您可能会得到非常糟糕的结果……

The performance side doesn't bother me (I'll happily call List.size() repeatedly, for example) but readability, consistency and non-repeating are all much more important. Essentially the first snippet conveys the idea of "get a value, then use it" much more effectively than the second does.

性能方面我并不介意(例如,我很高兴地多次调用List.size())),但可读性、一致性和非重复性都要重要得多。从本质上讲,第一个片段传达了“获取一个值,然后使用它”的思想,比第二个片段更有效。

So yes, I'm with you... is anyone recommending the second form to you?

是的,我支持你……有人向你推荐第二种形式吗?

#3


2  

I normally dislike the introduction of extra variables as every bit of added state makes a method more complex. But even I'd say that it's warranted in your example since the variable replaces 4 repetitions of identical code.

我通常不喜欢引入额外变量,因为每个添加的状态都会使方法更加复杂。但是即使我在你的例子中说它是有根据的因为这个变量替换了4个重复的相同代码。

But the variable should definitely be final!

但是变量应该是最终的!

#4


1  

I agree, but I also try to reduce use of 'instanceof' too, at the class design level.

我同意,但我也试图减少在类设计级别上使用“instanceof”。

#5


1  

I personally think the first one is cleaner. However, provided the called method is not something computation intensive, it doesn't matter much.

我个人认为第一个更干净。但是,只要所调用的方法不是计算密集型的,它就不重要。

Probably the second is a bit faster (if you use Java 1.6) because in the first example you make a copy of the variable, while the java VM will be likely to inline the function call in both examples. Of course optimization is never an argument with calls like this. The compiler does so many optimizations that we shouldn't bother (often it'll just reduce the speed because we dont' know it well enough).

可能第二个要快一点(如果您使用Java 1.6),因为在第一个示例中,您复制了变量,而Java VM很可能在两个示例中内联函数调用。当然,优化从来都不是像这样调用的参数。编译器做了太多的优化,所以我们不需要费心(通常它只会降低速度,因为我们不太了解它)。

#6


1  

As everybody that answered this question so far, I definitely prefer the first style. It can be even cleaner though:

到目前为止,每个人都回答了这个问题,我肯定更喜欢第一种风格。它甚至可以更干净:

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

#7


1  

Both examples need some work. Try to push the behavior into an abstract (or protected) method on Vehicle. If this is code you can't modify, use composition to put it inside of an interface in your code base so that you don't have to pollute the rest of your code with the poor design of the library you're using. This is definitely a code smell. See "Replace Conditional with Polymorphism" in Fowler's Refactoring book.

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


推荐阅读
  • 深入解析 Android IPC 中的 Messenger 机制
    本文详细介绍了 Android 中基于消息传递的进程间通信(IPC)机制——Messenger。通过实例和源码分析,帮助开发者更好地理解和使用这一高效的通信工具。 ... [详细]
  • 本文探讨了如何利用HTML5和JavaScript在浏览器中进行本地文件的读取和写入操作,并介绍了获取本地文件路径的方法。HTML5提供了一系列API,使得这些操作变得更加简便和安全。 ... [详细]
  • ListView简单使用
    先上效果:主要实现了Listview的绑定和点击事件。项目资源结构如下:先创建一个动物类,用来装载数据:Animal类如下:packagecom.example.simplelis ... [详细]
  • 本文详细探讨了Java中的ClassLoader类加载器的工作原理,包括其如何将class文件加载至JVM中,以及JVM启动时的动态加载策略。文章还介绍了JVM内置的三种类加载器及其工作方式,并解释了类加载器的继承关系和双亲委托机制。 ... [详细]
  • 本题探讨了在大数据结构背景下,如何通过整体二分和CDQ分治等高级算法优化处理复杂的时间序列问题。题目设定包括节点数量、查询次数和权重限制,并详细分析了解决方案中的关键步骤。 ... [详细]
  • 本文介绍了如何在多线程环境中实现异步任务的事务控制,确保任务执行的一致性和可靠性。通过使用计数器和异常标记字段,系统能够准确判断所有异步线程的执行结果,并根据结果决定是否回滚或提交事务。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ... [详细]
  • 在 Android 开发中,通过 Intent 启动 Activity 或 Service 时,可以使用 putExtra 方法传递数据。接收方可以通过 getIntent().getExtras() 获取这些数据。本文将介绍如何使用 RoboGuice 框架简化这一过程,特别是 @InjectExtra 注解的使用。 ... [详细]
  • 本文探讨了为何相同的HTTP请求在两台不同操作系统(Windows与Ubuntu)的机器上会分别返回200 OK和429 Too Many Requests的状态码。我们将分析代码、环境差异及可能的影响因素。 ... [详细]
  • 深入解析动态代理模式:23种设计模式之三
    在设计模式中,动态代理模式是应用最为广泛的一种代理模式。它允许我们在运行时动态创建代理对象,并在调用方法时进行增强处理。本文将详细介绍动态代理的实现机制及其应用场景。 ... [详细]
  • 本文将详细探讨 Java 中提供的不可变集合(如 `Collections.unmodifiableXXX`)和同步集合(如 `Collections.synchronizedXXX`)的实现原理及使用方法,帮助开发者更好地理解和应用这些工具。 ... [详细]
  • 本文旨在探讨如何利用决策树算法实现对男女性别的分类。通过引入信息熵和信息增益的概念,结合具体的数据集,详细介绍了决策树的构建过程,并展示了其在实际应用中的效果。 ... [详细]
  • 当unique验证运到图片上传时
    2019独角兽企业重金招聘Python工程师标准model:public$imageFile;publicfunctionrules(){return[[[na ... [详细]
  • 本文介绍了在JSP页面中显示用户登录时间的几种常见方法,包括直接使用Date对象、格式化日期输出以及使用SimpleDateFormat类进行更精确的时间显示。 ... [详细]
author-avatar
王德筠宛吟玟华
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有