Java 一个特殊的类 ServiceLoader<S> 详解

关于这个类官方文档说得太官方了,我给大家解释一下

首先这个类是 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();

  }

}

这样以后要扩展就多写一个实现类  多加一项配置  更好的体现了面向对象的思想

原文地址:https://www.cnblogs.com/nimendezaige/p/4866468.html