zoukankan      html  css  js  c++  java
  • 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();

      }

    }

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

  • 相关阅读:
    codevs 3971 航班
    2015山东信息学夏令营 Day4T3 生产
    2015山东信息学夏令营 Day5T3 路径
    Tyvj 1221 微子危机——战略
    清北学堂模拟赛 求和
    NOIP2012同余方程
    NOIP2009 Hankson的趣味题
    bzoj1441 MIN
    国家集训队论文分类
    贪心 + DFS
  • 原文地址:https://www.cnblogs.com/nimendezaige/p/4866468.html
Copyright © 2011-2022 走看看