一般情况下,我们看到的工具类的实现,大多用静态方法。
scala里面去除了静态方法,采用object的单例模式替代。
有几个问题:
1、工具类为什么一般用静态方法?
工具类一般是做工具用,没有自己的属性成员,也不建议在工具类里面使用属性,这样容易出现线程安全问题。
2、单例模式的使用场景
单例的出现是为了解决系统因为多次new实例造成资源的消耗,比如读取配置文件,每次实例化一次,就读取一次文件,这样消耗太大,因而一般启动时读取一次,以后每次都用这个单例获取键值对。
spring中的dao和service都是单例形式,对于数据库连接采用threadlocal,这样一方面避免线程不安全问题,一方面也方便事务的控制,比如事务嵌套、传播等。
3、scala的object分离静态方法和实例方法
scala的class和object在Java层面里面合二为一,class里面的成员成了实例成员,object成员/方法成了static成员/方法。scala这样其实是分离了静态方法和势力方法。
4、使用静态方法还是封装对象
大量使用静态方法有种脚本和面向过程的感觉,这样有没有什么坏处了,可能造成方法重用、扩展问题。
比如,对于数据库增删改查操作,有的就这样设计:
@Bean
public class UserServiceImpl extends BaseService implements UserService {
@Override
public User login(Map<String, Object> fieldMap) {
String username = String.valueOf(fieldMap.get("username"));
String password = String.valueOf(fieldMap.get("password"));
return DataSet.select(User.class, "username = ? and password = ?", username, password);
}
}
设计成了静态方法。
一般面向对象的设计是,抽出来为一个base dao,由所有entity去继承。这有什么好处了,一方面是方面方法的重用,上面那种方法sql写多了,不大容易重用,因为写起来太容易了,根本不用dao去封装;一方面是扩展的问题,比如要拦截指定对象的删除方法,这个对于静态方法怎么拦截呢?