《Java工程师必读手册》——Java极客主义系列——Java代码高效之道(3)

简介: 《Java工程师必读手册》——Java极客主义系列——Java代码高效之道(3)

接上篇:https://developer.aliyun.com/article/1227044?spm=a2c6h.13148508.setting.15.18334f0eu8bmt9


三、 方法

 

1. 把跟类成员变量无关的方法声明成静态方法

 

静态方法的好处就是不用生成类的实例就可以直接调用。静态方法不再属于某个对象,而是属于它所在的类。只需要通过其类名就可以访问,不需要再消耗资源去反复创建对象。即便在类内部的私有方法,如果没有使用到类成员变量,也应该声明为静态方法。

 

反例

 

image.png

 

正例

 

image.png

 

2. 尽量使用基本数据类型作为方法参数类型,避免不必要的装箱、拆箱和空指针判断

 

反例

 

image.png

 

正例

 

image.png

 

3. 尽量使用基本数据类型作为方法返回值类型,避免不必要的装箱、拆箱和空指针判断

 

在JDK类库的方法中,很多方法返回值都采用了基本数据类型,首先是为了避免不必要的装箱和拆箱,其次是为了避免返回值的空指针判断。比如:Collection.isEmpty()和Map.size()。

 

反例

 

image.png

 

正例

 

image.png

 

4. 协议方法参数值非空,避免不必要的空指针判断

 

协议编程,可以@NonNull和@Nullable标注参数,是否遵循全凭调用者自觉。

 

反例

 

image.png

 

正例

 

image.png

 

5. 协议方法返回值非空,避免不必要的空指针判断

 

协议编程,可以@NonNull和@Nullable标注参数,是否遵循全凭实现者自觉。

 

 

反例

 

image.png

 

正例

 

image.png

 

6. 被调用方法已支持判空处理,调用方法无需再进行判空处理

 

反例

 

image.png

 

正例

 

image.png

 

 

 

7. 尽量避免不必要的函数封装

 

方法调用会引起入栈和出栈,导致消耗更多的CPU和内存,应当尽量避免不必要的函数封装。当然,为了使代码更简洁、更清晰、更易维护,增加一定的方法调用所带来的性能损耗是值得的。

 

反例

 

image.png 

 

正例

 

image.png 

 

8. 尽量指定方法的final修饰符

 

方法指定final修饰符,可以让方法不可以被重写,Java编译器会寻找机会内联所有的final方法。内联对于提升Java运行效率作用重大,具体可参见Java运行期优化,能够使性能平均提高50%。

 

注意

所有的private方法会隐式地被指定final修饰符,所以无须再为其指定final修饰符。

 

反例

 

image.png 

 

正例

 

image.png 

 

注意

使用Spring的AOP特性时,需要对Bean进行动态代理,如果方法添加了final修饰,将不会被代理。

 

9. 尽量使用方法传递代替值传递

 

尽量使用方法传递代替值传递,可以避免不必要的方法计算。比如Optional的orElseT value方法和orElseGetSupplier supplier方法:其中orElseT value方法无论前面Optional容器值是null还是nonNull,都会提前执行orElse里的方法;然而orElseGetSupplier supplier方法并不会,只会在Optional容器值为null时才调用orElseGet里的方法。

 

反例

 

image.png

 

正例

 

image.png


接下篇:https://developer.aliyun.com/article/1227041?groupCode=java 

相关文章
|
13天前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
|
27天前
|
XML 安全 Java
Java反射机制:解锁代码的无限可能
Java 反射(Reflection)是Java 的特征之一,它允许程序在运行时动态地访问和操作类的信息,包括类的属性、方法和构造函数。 反射机制能够使程序具备更大的灵活性和扩展性
37 5
Java反射机制:解锁代码的无限可能
|
23天前
|
jenkins Java 测试技术
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
59 3
|
29天前
|
存储 安全 Java
系统安全架构的深度解析与实践:Java代码实现
【11月更文挑战第1天】系统安全架构是保护信息系统免受各种威胁和攻击的关键。作为系统架构师,设计一套完善的系统安全架构不仅需要对各种安全威胁有深入理解,还需要熟练掌握各种安全技术和工具。
80 10
|
24天前
|
分布式计算 Java MaxCompute
ODPS MR节点跑graph连通分量计算代码报错java heap space如何解决
任务启动命令:jar -resources odps-graph-connect-family-2.0-SNAPSHOT.jar -classpath ./odps-graph-connect-family-2.0-SNAPSHOT.jar ConnectFamily 若是设置参数该如何设置
|
23天前
|
Java
Java代码解释++i和i++的五个主要区别
本文介绍了前缀递增(++i)和后缀递增(i++)的区别。两者在独立语句中无差异,但在赋值表达式中,i++ 返回原值,++i 返回新值;在复杂表达式中计算顺序不同;在循环中虽结果相同但使用方式有别。最后通过 `Counter` 类模拟了两者的内部实现原理。
Java代码解释++i和i++的五个主要区别
|
2月前
|
搜索推荐 Java 数据库连接
Java|在 IDEA 里自动生成 MyBatis 模板代码
基于 MyBatis 开发的项目,新增数据库表以后,总是需要编写对应的 Entity、Mapper 和 Service 等等 Class 的代码,这些都是重复的工作,我们可以想一些办法来自动生成这些代码。
31 6
|
设计模式 搜索推荐 Java
Java 极客技术 2019 年高考语文卷
Java 极客技术 2019 年高考语文卷
|
9天前
|
Java 开发者
Java多线程编程中的常见误区与最佳实践####
本文深入剖析了Java多线程编程中开发者常遇到的几个典型误区,如对`start()`与`run()`方法的混淆使用、忽视线程安全问题、错误处理未同步的共享变量等,并针对这些问题提出了具体的解决方案和最佳实践。通过实例代码对比,直观展示了正确与错误的实现方式,旨在帮助读者构建更加健壮、高效的多线程应用程序。 ####
|
8天前
|
安全 Java 开发者
Java 多线程并发控制:深入理解与实战应用
《Java多线程并发控制:深入理解与实战应用》一书详细解析了Java多线程编程的核心概念、并发控制技术及其实战技巧,适合Java开发者深入学习和实践参考。
下一篇
无影云桌面