開発が進んでいるStarlingフレームワークの新しいバージョンに、EventDispatcher.dispatchEventWith()メソッドが加わる予定のようです。開発者のDaniel Sperl氏より、Starling Forumにイベントシステム整備の提案として投稿されました。このメソッドは、EventDispatcher.dispatchEvent()と同じく、イベントを配信します。では、どこが違うのか、氏の投稿記事に沿って見てみましょう。
第1に、EventDispatcher.dispatchEventWith()メソッドは、引数のイベントオブジェクトを新たにつくらずに済みます。なお、第2引数はイベントをバブリングさせるかどうかのブール値です。
object.dispatchEventWith(Event.TRIGGERED, true);
object.dispatchEvent(new Event(Event.TRIGGERED, true));
イベントクラスのコンストラクタを呼出さないのは、ただ記述が楽になるだけでなく、内部的にオブジェクトの使い回しをして、負荷を下げているようです[*1]。
第2に、EventDispatcher.dispatchEventWith()メソッドの第3引数に任意のObject型の値を渡すと、イベントオブジェクトにそのデータが加えられます。そのために、Eventクラスには新たにEvent.dataプロパティ(Objectデータ型)が備わりました。ということは、配信するイベントオブジェクトに任意の値を加えたいとき、わざわざカスタムEventクラスを定めなくても済むのです。
addEventListener("customType", onEvent);
dispatchEventWith("customType", false, "testData");private function onEvent(event:Event):void {
trace(event.data); // 出力: testData
}
第3として、EventDispatcher.dispatchEventWith()メソッドの第3引数に渡した値は、イベントリスナーの第2引数でも受取れます。しかも、リスナー関数の引数は、必要がなければすべて省いてしまっても構いません。イベントリスナーの定め方がかなり柔軟になるのです。
addEventListener("customType", onEvent);
dispatchEventWith("customType", false, "testData");// version 1:
function onEvent():void {
// 引数は要らず、イベントのみ捉えればよい
}// version 2:
function onEvent(event:Event):void {
// Event.dataプロパティを取出す
trace(event.data); // 出力: testData
}// version 3:
function onEvent(event:Event, data:String):void {
// 引数で追加データを受取る
trace(data); // 出力: testData
}
第4に、イベントリスナーの引数については、定義済みのイベントについても使いやすい改善が加えられているようです。
addEventListenerWith(Event.ADDED_TO_STAGE, onAddedToStage);
function onAddedToStage():void {
// イベントオブジェクトが必要?!
}addEventListenerWith(Event.ENTER_FRAME, onEnterFrame);
function onEnterFrame(event:Event, passedTime:Number):void {
// passedTimeで経過時間がわかる
}addEventListenerWith(KeyboardEvent.KEY_DOWN, onKey);
function onKey(event:Event, keyCode:uint):void {
// keyCodeがわかれば十分では
}
[*1] 実装としては「オブジェクトプーリング」を行い、使い回せるイベントオブジェクトがあれば新たにつくらず、それを再利用する仕組みだと思われます。