Rubyで利用できるMixinは、いわば多重継承の仕組みです。
CGLIBを使うことで、Javaでも疑似Mixinが使えます。
ただしインターフェイスベースでのMixinです。
以下のサンプルは、
HumanオブジェクトとEmployeeオブジェクトを合成して
両方のメソッドを持った新しいオブジェクトを作成しています。
合成後のオブジェクトには、
元オブジェクトのインターフェイスを介してアクセスできます。
Humanクラスには、Talkerインターフェイスが、
Employeeクラスには、Workerインターフェイスが、
それぞれ実装されていて、
結果のオブジェクトが両方のインターフェイスで
キャストしてメソッドを実行しています。
Start.java
import net.sf.cglib.proxy.Mixin; public class Start{ public static void main(String args[]){ Human h = new Human(); Employee e = new Employee(); Class[] delegates = new Class[]{ Talker.class, Worker.class}; Object[] objects = new Object[]{h,e}; Object mixin = Mixin.create(delegates,objects); ((Talker)mixin).talk(); ((Worker)mixin).work(); } } class Human implements Talker{ public void talk(){ System.out.println("hello!"); } } class Employee implements Worker{ public void work(){ System.out.println("work!"); } } interface Talker{ public void talk(); } interface Worker{ public void work(); }
実行結果
C:\java\mixin>javac -cp cglib-nodep-2.1_3.jar Start.java C:\java\mixin>java -cp .;cglib-nodep-2.1_3.jar Start hello! work!