现在的位置: 首页 > 移动开发 > 正文

什么是混入mixin?Java8对混入有哪些模式

2020年06月08日 移动开发 ⁄ 共 2491字 ⁄ 字号 评论关闭

  Java8开始出现,带来一个全新特性:使用Lambda表达式(JSR-335)进行函数式编程。今天我们要讨论的是Lambda的其中一部分:虚拟扩展方法,也叫做公共辩护(defender)方法。下面学步园小编来讲解下什么是混入mixin?Java8对混入有哪些模式?

  什么是混入mixin

  混入是一种组合的抽象类,主要用于多继承上下文中为一个类添加多个服务,多重继承将多个mixin组合成你的类。例如,如果你有一个类表示“马”,你可以实例化这个类来创建一个“马”的实例,然后通过继承像“车库”和“花园”来扩展它,使用Scala的写法就是:

  1 valmyHouse=newHousewithGaragewithGarden

  从mixin继承并不是一个特定的规范,这只是用来将各种功能添加到已有类的方法。在OOP中,有了mixin,你就有通过它来提升类的可读性。

  例如在Python的socketserver模块中就有使用mixin的方法,在这里,mixin帮助4个基于不同Socket的服务,包括支持多进程的UDP和TCP服务以及支持多线程的UDP和TCP服务。

  1 classForkingUDPServer(ForkingMixIn,UDPServer):pass

  2 classForkingTCPServer(ForkingMixIn,TCPServer):pass

  3

  4 classThreadingUDPServer(ThreadingMixIn,UDPServer):pass

  5 classThreadingTCPServer(ThreadingMixIn,TCPServer):pass

  什么是虚拟扩展方法?

  Java8将引入虚拟扩展方法的概念,也叫publicdefendermethod.让我们姑且把这个概念简化为VEM。

  VEM旨在为Java接口提供默认的方法定义,你可以用它在已有的接口中添加新的方法定义,例如Java里的集合API。这样类似Hibernate这样的第三方库无需重复实现这些集合API的所有方法,因为已经提供了一些默认方法。

  下面是如何在接口中定义方法的示例:

  1 publicinterfaceCollectionextendsIterable{

  2

  3 Collectionfilter(Predicatep)

  4 default{returnCollections.filter(this,p);}

  5

  6 }

  Java8对混入有哪些模式

  现在我们来通过VEM实现一个混入效果,不过事先警告的是:请不要在工作中使用!

  下面的实现不是线程安全的,而且还可能存在内存泄露问题,这取决于你在类中定义的hashCode和equals方法,这也是另外一个缺点,我将在后面讨论这个问题。

  首先我们定义一个接口(模拟状态Bean)并提供方法的默认定义:

  1 publicinterfaceSwitchableMixin{

  2 booleanisActivated()default{returnSwitchables.isActivated(this);}

  3 voidsetActivated(booleanactivated)default{Switchables.setActivated(this,activated);}

  4 }

  然后我们定义一个工具类,包含一个Map实例来保存实例和状态的关联,状态通过工具类中的私有的嵌套类代表:

  01 publicfinalclassSwitchables{

  02

  03 privatestaticfinalMapSWITCH_STATES=newHashMap<>();

  04

  05 publicstaticbooleanisActivated(SwitchableMixindevice){

  06 SwitchableDeviceStatestate=SWITCH_STATES.get(device);

  07 returnstate!=null&&state.activated;

  08 }

  09

  10 publicstaticvoidsetActivated(SwitchableMixindevice,booleanactivated){

  11 SwitchableDeviceStatestate=SWITCH_STATES.get(device);

  12 if(state==null){

  13 state=newSwitchableDeviceState();

  14 SWITCH_STATES.put(device,state);

  15 }

  16 state.activated=activated;

  17 }

  18

  19 privatestaticclassSwitchableDeviceState{

  20 privatebooleanactivated;

  21 }

  22

  23 }

  这里是一个使用用例,突出了状态的继承:

  1 privatestaticclassDevice{}

  2

  3 privatestaticclassDeviceAextendsDeviceimplementsSwitchableMixin{}

  4

  5 privatestaticclassDeviceBextendsDeviceimplementsSwitchableMixin{}

  1 DeviceAa=newDeviceA();

  2 DeviceBb=newDeviceB();

  3

  4 a.setActivated(true);

  5

  6 assertThat(a.isActivated()).isTrue();

  7 assertThat(b.isActivated()).isFalse();

  以上就是关于“什么是混入mixin?Java8对混入有哪些模式”的内容,希望对大家有用。更多资讯请关注学步园。学步园,您学习IT技术的优质平台!

抱歉!评论已关闭.