接上篇:https://developer.aliyun.com/article/1227044?spm=a2c6h.13148508.setting.15.18334f0eu8bmt9
三、 方法
1. 把跟类成员变量无关的方法声明成静态方法
静态方法的好处就是不用生成类的实例就可以直接调用。静态方法不再属于某个对象,而是属于它所在的类。只需要通过其类名就可以访问,不需要再消耗资源去反复创建对象。即便在类内部的私有方法,如果没有使用到类成员变量,也应该声明为静态方法。
反例:
正例:
2. 尽量使用基本数据类型作为方法参数类型,避免不必要的装箱、拆箱和空指针判断
反例:
正例:
3. 尽量使用基本数据类型作为方法返回值类型,避免不必要的装箱、拆箱和空指针判断
在JDK类库的方法中,很多方法返回值都采用了基本数据类型,首先是为了避免不必要的装箱和拆箱,其次是为了避免返回值的空指针判断。比如:Collection.isEmpty()和Map.size()。
反例:
正例:
4. 协议方法参数值非空,避免不必要的空指针判断
协议编程,可以@NonNull和@Nullable标注参数,是否遵循全凭调用者自觉。
反例:
正例:
5. 协议方法返回值非空,避免不必要的空指针判断
协议编程,可以@NonNull和@Nullable标注参数,是否遵循全凭实现者自觉。
反例:
正例:
6. 被调用方法已支持判空处理,调用方法无需再进行判空处理
反例:
正例:
7. 尽量避免不必要的函数封装
方法调用会引起入栈和出栈,导致消耗更多的CPU和内存,应当尽量避免不必要的函数封装。当然,为了使代码更简洁、更清晰、更易维护,增加一定的方法调用所带来的性能损耗是值得的。
反例:
正例:
8. 尽量指定方法的final修饰符
方法指定final修饰符,可以让方法不可以被重写,Java编译器会寻找机会内联所有的final方法。内联对于提升Java运行效率作用重大,具体可参见Java运行期优化,能够使性能平均提高50%。
注意:
所有的private方法会隐式地被指定final修饰符,所以无须再为其指定final修饰符。
反例:
正例:
注意:
使用Spring的AOP特性时,需要对Bean进行动态代理,如果方法添加了final修饰,将不会被代理。
9. 尽量使用方法传递代替值传递
尽量使用方法传递代替值传递,可以避免不必要的方法计算。比如Optional的orElse(T value)方法和orElseGet(Supplier supplier)方法:其中orElse(T value)方法无论前面Optional容器值是null还是nonNull,都会提前执行orElse里的方法;然而orElseGet(Supplier supplier)方法并不会,只会在Optional容器值为null时才调用orElseGet里的方法。
反例:
正例:
接下篇:https://developer.aliyun.com/article/1227041?groupCode=java