[java乱弹]--(3)我眼中的工具类

版权声明: https://blog.csdn.net/zhaoyaxuan001/article/details/82312713
声明:
Author:赵志乾
Date:2018-9-2
Declaration:All Right Reserved!!!

在《“类”是虚拟机构建对象的原材料,是真的吗?》一节中,我们谈及工具类是一种特殊的类,他只有静态方法。这种类在使用上的特点就是无需进行实例化,通过类便可直接调用静态方法,其对应的机理便是所谓的静态绑定。

一说到静态绑定,就不得不说一下他的孪生兄弟:动态绑定。动态绑定的特点是:直到运行时才会确定某一引用所引用堆内存空间上存储对象的具体类型,这一类型是在虚拟机构建对象时关联上去的,从而能够依据对象的真实类型调用最合适的方法。他的好处就是可以在某种程度上实现“功能”与“实现”之间的解耦,即编写代码时,面向的是接口或者超类这件变身外袍,而对于袍里面的那个人是谁需要到真是运行时才能够确定。进而降低更换“具体实现”所付出的代价。

在java语言中,默认是采用动态绑定的。如果软件开发人员不希望某一方法使用动态绑定机制,可以将该方法声明为final方法或者static方法。但这两种方式是有区别的:

1、final方法:表示该方法在子类中不可被复写,从而以该类“面貌”出现于公众场合时,此方法只有一种实现。编译器会通过优化的方式将其转换成静态绑定方式。

2、static方法:表示该方法位于类上,其不能够操作该类实例的数据域或调用该类实例的方法。因此,就应用范围上来说static更为受限。

从某种角度来看,static方法调用不依赖于堆空间上分配的内存。究其跟因:使用静态绑定机制,即在编译过程中,就已经由编译器确定了需要调用哪个方法。这也是为什么在引用指向null时,依然能够调用引用类型上的static方法。

现在回到工具类的讨论上,工具类中的方法都是静态方法,使用时无需实例化。那到底什么样的类要实现成工具类?是不是只要没有实例域的类都应该实现成工具类呢?

其实完全依据是否需要有实例域这一点进行断定,过于极端。因为工具类的本质是提供某种既定的功能,这种功能要求具有普适性和不变性。所谓不变性就是指在可预见的未来,他对外提供的接口是不变动的,比如标准库中Math类。但在实际应用中经常会见到开发人员会将某些向外部服务发请求的类实现成工具类(里面只有静态方法)。当需要对接不同的接口时,不得不去变更原有的工具类。更令人难以接受的是某天又需要你再把接口变回来。此时最好的方法就是将该类的方法实现为实例方法,然后调用方法的地方面向接口编程,当需要进行不同对接时,只需要更换变身外袍下那个具体的实现即可。

综上所述:仅包含静态方法的工具类实现准则为“无需使用实例域且方法的实现在可预见的未来不会发生变更”。

扫描二维码关注公众号,回复: 3711044 查看本文章

猜你喜欢

转载自blog.csdn.net/zhaoyaxuan001/article/details/82312713
今日推荐