Haxe:迭代的空对象模式

时间:2016-04-19 08:43:42

标签: object design-patterns null haxe iterable

我想为Iterable类实现Null Object设计模式。例如,如果我的内部数组没有初始化,那么包装类仍会返回不会破坏主逻辑的空Iterator:

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接口但不包含任何内容的其他内容?或者可能有更直接的解决方案?

1 个答案:

答案 0 :(得分: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

或者

你可以使用虚拟迭代器:

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