为什么 NodeList 不扩展 Collection 或 Iterable?



也许这不是一个真正的编程问题。但是…

为什么是org.w3c.dom。NodeList不是java.lang.Iterable接口的扩展?

这听起来太违反直觉了。特别是因为文档说:

NodeList接口提供了节点有序集合的抽象,但没有定义或约束该集合的实现方式。DOM中的NodeList对象是活动的。NodeList中的项可以通过从0开始的整型索引访问。

PS:请在适当的地方引用你的答案。

org.w3c.dom.NodeList早于Iterable,后者在Java 1.5版中引入。

可能是由于兼容性原因没有更新,但我没有参考资料。

w3c只定义规范(XML、XSLT、DOM等),并没有试图使API与任何特定的语言或平台保持一致。

它的目的是为解析器的开发人员提供一个指导方针,以生产与使用这些解析器的现有代码兼容的产品。

当你构建你的应用程序框架时,最好包装所有的API调用,这样你就可以控制如何在不同的语言或不同的平台上访问API。

在Java, JavaScript, c#或任何你使用的,创建一个类对象包装访问API调用。在JavaScript中,它将有助于使代码跨浏览器兼容,如果您针对多个平台发布解决方案,则只需更新包装器类。

下面是一个示例,但是,您可以随心所欲地定义自己的包装器接口和基类,并使用派生类重写来提供特定的实现。

function XMLNode(xnode) {
  this.xnode = xnode;
}
function getNodes(path, xnode) {
  if (browseTYPE != IE) {
      //Ordered SnapShot
      if (xnode.evaluate)          
          fld = xnode.evaluate(path, xnode, null, 7, null);
      else
          fld = xnode.ownerDocument.evaluate(path, xnode, null, 7, null); 
      //We need a result wrapper here
      if (fld != null) return new XMLSnapShotList(fld); 
  } else {
      fld = xnode.selectSingleNode(path).childNodes;
      //We need a result wrapper here
      if (fld != null) return new XMLList(fld); 
  }
  return null;
}
XMLNode.prototype.getNodes = getNodes;

最新更新