Java : Mixin(多重継承)とかパーシャルクラスとか

JavaにはMixinやパーシャルクラスがないので、それっぽいことをしたいときには委譲コードをたくさん書かなければいけないから(´Д`)マンドクサ とか、言語上の欠陥だ!という勢いで批判する*1という人がいるけれど、それはJavaという言語を使いこなせていないだけなんじゃね?と思う。
ということで、JavaでMixinのようなことがしたいときにはどうするかということを、さらっと書いてみたい。

      • -

まず、toString()で受け取った文字列を反転するmixinクラスを次のように作る。

abstract class StringMixin {
  abstract String toString();
  String reverse() {
    String str = toString();
    StringBuffer ret = new StringBuffer();
    for (int i=str.length()-1; i>=0; --i){
      ret.append(str.charAt(i));
    }
    return str.toString();
  }
}

次に、猫クラスを作って、その名前に対する加工処理をmixinしてみる。

class Cat {
  String name;
  Cat(String name) { this.name = name;}
  
  //Mix-in
  final StringMixin name_ad
    = new StringMixin() { String toString() { return name;}};
}

また、雑誌クラスに対してもmixinしてみる。

class Magazine {
  String title;
  Magazine(String title) { this.title = title;}
  
  //Mix-in
  final StringMixin title_ad
    = new StringMixin() { String toString() { return name;}};
}

使い方は(省略)。
おわり。

      • -

ちなみに、聡い読者の方ならお気づきと思いますが、final属性を外せば、動的にmixinを切り替えることができます。
また、同じMixinを対象とするフィールドを切り替えて、複数持たせることもできます。(下のように)

class Book {
  String author;
  String title;
  Book(String author, String title) {
    this.author = author;
    this.title = title;
  }
  
  //Mix-in
  final StringMixin author_ad
    = new StringMixin() { String toString() { return author;}}
  final StringMixin title_ad
    = new StringMixin() { String toString() { return author;}}
}