从Arrays源码学习定义工具类
背景
在日常编码中,一个比较好的实践是:我们把一些业务无关的、可复用的一些通用逻辑,封装成工具类、甚至jar包。这样一方面方便通用代码抽取、代码复用,同时也隔离经常变动的业务代码和不变的通用代码。那如何定义好一个工具类呢?接下来我们结合JDK中的Arrays工具类源码来学习。
如何定义好工具类
-
业务无关性
工具类最大的便利就是复用,而复用势必会带来与调用者的耦合。为了尽量减少工具类和调用者的耦合,就要保持工具类的业务无关性、单一职责和精简。
假如工具类、为了兼容上游A/B/C/D不同调用者,而在类本身引入大量if-else等判断分支,这虽然满足了复用,但极大增加了代码耦合,反而得不偿失。
-
私有化构造方法
工具类由于其业务无关性和无状态,所以其行为直接和类相关,直接通过类名来调用静态方法。为了避免类被初始化,直接私有化构造方法,仅允许通过类名来调用方法。如Arrays的源码,通过私有话构造方法,强化通过类名调用。
-
内部方法不要暴露
基于迪米特法则(最少知道原则),我们应该尽量小的暴露类方法。
只有需要提供给调用者使用的,才定义为public权限。一些不需要暴露给调用者的(如内部方法),要定义为private权限。
这条原则在非工具类中也适用,但是工具类毕竟复用的地方较多,暴露不必要的方法,反而给调用者造成歧义和负担。
如下图Arrays的源码中,sort()方法,是需要暴露给外部的,所以定义为public,并且因为通过类名直接调用,同时也是static静态方法。而rangeCheck是供public方法调用的内部方法,因此就定义为private,无需对外暴露。
同时,也可根据rangeCheck方法,学到使用卫语句,快速失败和根据场景,返回不同的自定义异常。
-
善用方法重载
对于实现的功能相同,只是输入参数不同的情况,建议使用重载方法。因为工具类,主要是供外部调用的,对于重载的方法,调用者可以很方便的知道,实现的功能是下相同的,只是入参不同。如Arrays中的sort重载方法,这样你一看就知道它们实现的功能是相同的,可以放心选择调用。
-
方法注释要详细
工具类不同于业务代码,由于其复用的普遍性,需要具有较强的可读性。因此,工具类的对外的常量或方法,一定要做好方法注释。让调用者无需查看方法逻辑,迅速就能知道,方法的作用、入参和返回值的含义,进而提高使用工具类的效率。例如Arrays中,对方法进行了详细的注释,以便调用者快速了解此方法。