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

首先这个类是 final 不能继承的

 

经常我们会 有一个接口  许多实现类  比如: UserDao 接口有 UserDaoImpl1  UserDaoImpl2 ....等多个实现

这时候我们只能自己new 但是有了ServiceLoader<S>就非常方便  他会帮我们把实现类放入一个集合 方便遍历 

但是这又有什么用呢   这个配合命令模式 就有大用了

首先在src文件夹下面创建一个META-INF文件夹  里面再创建一个services文件夹

里面放着一个你接口的全类名 的文件 比如 org.web.UserDao  

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

而文件里面放着这个接口的实现类 比如 org.web.UserDaoImpl1  org.web.UserDaoImpl2

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

然后一句代码就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();

  }

}

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

相关文章:

  • 2021-05-16
  • 2021-07-07
  • 2022-01-26
  • 2021-05-01
  • 2022-01-02
  • 2021-05-05
猜你喜欢
  • 2021-07-10
  • 2021-06-07
  • 2022-12-23
  • 2022-12-23
  • 2021-11-02
  • 2022-12-23
相关资源
相似解决方案