关于这个类官方文档说得太官方了,我给大家解释一下
首先这个类是 final 不能继承的
经常我们会 有一个接口 许多实现类 比如: UserDao 接口有 UserDaoImpl1 UserDaoImpl2 ....等多个实现
这时候我们只能自己new 但是有了ServiceLoader<S>就非常方便 他会帮我们把实现类放入一个集合 方便遍历
但是这又有什么用呢 这个配合命令模式 就有大用了
首先在src文件夹下面创建一个META-INF文件夹 里面再创建一个services文件夹
里面放着一个你接口的全类名 的文件 比如 org.web.UserDao
而文件里面放着这个接口的实现类 比如 org.web.UserDaoImpl1 org.web.UserDaoImpl2
然后一句代码就OK了 ServiceLoader<UserDao>list=ServiceLoader.load(UserDao.class);
然后就可以遍历list了
接下来介绍一下这个ServiceLoader的常用用途
比如我们要判断传过来来的值是什么类型的
if(a == 1){
//处理的事
}
else if(a == 2){
//处理的事
}else if(a == 2){
//处理的事
}
这样的话以后多一种情况就多一种else if 不利于扩展
所以可以把每个if 做成命令模式
首先创建一个借口 Interface
public interface inte{
//判断是否用这个实现类的解决方案
public boolean is(int num);
//解决方案
public void result();
}
然后创建2个实现类
public interface inte{
public boolean is(int num){
//代替了多重if
if(num == 1)
return true;
return false;
}
public void result(){
//这里是 1的解决方案
}
}
public interface inte{
public boolean is(int num){
//代替了多重if
if(num == 2)
return true;
return false;
}
public void result(){
//这里是 2的解决方案
}
}
写好services里面的对应接口和实现类的全类名
ServiceLoader<Inte> list=ServiceLoader.load(Inte.class);
然后一个循环
for(Inte in :list){
if(in.is(1)){
in.result();
}
}
这样以后要扩展就多写一个实现类 多加一项配置 更好的体现了面向对象的思想