前言
最近接手别人的项目,在看代码时发现了持久层方法使用了static修饰。之前也遇到过类似的问题,关于service层和dao层,我们究竟是使用spring依赖注入成单例(默认)还是使用static修饰每一个方法,将类写成工具呢?在网上也是简单的搜索了一下,在这里做一个小小的总结,如有错误或不准确之处,还请大家及时指出。
1、单例模式
关于单例模式的概念这里不再多说,单例模式的好处有如下几个:
1)只有一个实例对象,节省内存空间
2)支持延迟加载
3)由于单例对象一般用static修饰,所以一次创建长久使用,即不会被GC回收
2、静态方法
相对于单例模式,静态方法的优势如下:
1)没有实例对象,直接使用方法
2)速度更快
但静态方法也有劣势:
1)不能延迟加载,JVM启动时自动加载static修饰的对象
2)耦合性强,这里所说的耦合性强是指静态方法无法被重写,因为重写是针对非静态方法而言,当方法需要变更的时候必须进行修改操作,违反了开闭原则。可能有的童鞋没有理解,举例言之,接口A是我们的dao层方法规范,我们通过实现类A1来完善方法功能,如果有变更,可以新建一个实现类或A1的子类A2来完成,此时调用方不需要做任何的更改;而如果使用静态方法,则需要修改调用方
3)事务控制更加麻烦,我们在用spring做事务控制的时候是基于AOP实现的,其原理是使用JDK的动态代理或者cglib来实现,不管使用哪一种,都需要一个实例对象来创建代理对象,而使用静态方法时由于没有实例对象,所以也就无法使用这种声明式事务了
3、总结
个人推荐优先使用单例模式,那么什么时候使用静态方法呢?对于一个类,满足单例情况且不会出现上面所说的耦合性和事务问题即可使用静态方法,如java中的Math类。我刚接手的项目中是对redis的一个简单查询功能,满足上述的情况,所以也适用静态方法来实现。