2016-04-19 3 views
1

IterableクラスのNullオブジェクトデザインパターンを実装したいと思います。Haxe:iterablesのヌルオブジェクトパターン

public function iterator():Iterator<T> { 
    // ...of cause it doesn't work, because Iterator is typedef not class 
    return mList != null ? mList.iterator() : new Iterator<T>(); 
} 

var mList:Array<T>; 

が、私はアイテムの所望のタイプやIteratorを実装して何か他のものと静的な空の仮配列をインスタンス化する必要があります私の内部配列が初期化されていない場合たとえば、ラッパークラスはとにかくメインロジックを破壊しない、空のIteratorを返します。インタフェースは何も含まれていませんか?またはもっとストレートな解決策があるかもしれませんか?

答えて

4

あなたはのisEmpty機能のいくつかの種類を追加することにより、オブジェクトのクラス自体にフォアハンドでチェックを行うことができます:

if(!iter.isEmpty()) { 
    for(i in iter) { 
    trace(i); 
    } 
} 

例:http://try.haxe.org/#8719E

public function isEmpty():Bool { 
    return mList == null || mList.length == 0; 
} 

を次に、このようにそれを使用します

または

この場合、ダミーイテレータを使用できますS:

class NullIterator { 
    public inline function hasNext() return false; 
    public inline function next() return null; 
    public inline function new() {} 
} 

...と、この

public function iterator():Iterator<T> { 
    return mList != null ? mList.iterator() : new NullIterator(); 
} 

例のようにそれを使用する:あなたが行動を変更する必要があると思われる場合http://try.haxe.org/#B2d7e

は、その後、あなたはGithubの上の問題を上げることができます。 https://github.com/HaxeFoundation/haxe/issues

+1

ダミーイテレータは完全に動作します。ありがとう! – meps

関連する問題