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

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

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

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

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

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

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

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

8c68ea3a61097cef505a65951cc835ef.png

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

538fa265758439d6319a2efa7e48e7b9.png

然后一句代码就OK了  ServiceLoaderlist=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 list=ServiceLoader.load(Inte.class);

然后一个循环

for(Inte in :list){

if(in.is(1)){

in.result();

}

}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值