mixinの不具合(JavaFX 1.2.1)
JavaFXではmixinを採用している為、Javaよりも柔軟に機能拡張を行う事ができます。
ですが、まだまだ不安定な状況で言語仕様にも記述されておらず、手探りでやるしかない状況です。また、致命的な不具合もあるようです。
尚、この情報はあくまでJavaFX1.2.1の段階の不具合なので次のバージョンでは改善されている可能性は高いです(既にバグレポートはOpenされている)。
サンプルコード
mixin class Mix { public var x = 1; public function show() { println("Mix: x={this.x} {this}") } } class Foo { public var x = 2; public function show() { println("Foo: x={this.x} {this}") } } class Bar extends Foo, Mix { postinit { Foo.show(); Mix.show(); println(Foo.x); println(Mix.x); } } var bar = Bar { }; (bar as Foo).show(); (bar as Mix).show(); println((bar as Foo).x); println((bar as Mix).x);
Bar <= Foo + Mix という構成です。
実行結果。
Foo: x=2 snippets.mixin.MixInExample$Bar@35175422
Mix: x=2 snippets.mixin.MixInExample$Bar@35175422
0
2
Foo: x=2 snippets.mixin.MixInExample$Bar@35175422
Foo: x=2 snippets.mixin.MixInExample$Bar@35175422
2
2
関数の方は期待した通りの実行なのですが、変数は明らかにおかしいですね。そもそも0ってなに?という感じです。
また、現状では初期化パラメータでxを指定する事ができません。
var bar = Bar { x: 100 };
これは参照が曖昧なため、エラーとなるのは当然ですが、
var bar = Bar {
Mix.x: 100
};
というように記述しても、JavaFX1.2.1のコンパイラは解釈してくれません。
というわけで、mixinを使うにはまだちょっと早いですというお話でした。