2016-04-19 5 views
1

Я хотел бы реализовать шаблон проектирования Null Object для класса Iterable. Например, если мой внутренний массив не инициализирован, класс-оболочка все равно возвращает пустой итератор, который не нарушает основную логику:Haxe: шаблон нулевого объекта для итераций

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 интерфейс, но ничего не содержит? Или может быть более прямое решение?

ответ

4

Вы могли бы сделать чек на переду в самом классе объектов, добавляя некоторую функцию IsEmpty:

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

Затем использовать его как это:

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

Пример: http://try.haxe.org/#8719E

or

Вы можете использовать фиктивный итератор для thi 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