NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes();
我是JAVA新手。任何人都可以善意地解释上述陈述的结构吗?为什么可以用另一种方法调用方法?
我明白一个实例的方法,可以通过以下方式获得:
objectName.methodName();
在上面的语句,还有一个对象名称相关的三个方法名。这个怎么用?
NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes();
我是JAVA新手。任何人都可以善意地解释上述陈述的结构吗?为什么可以用另一种方法调用方法?
我明白一个实例的方法,可以通过以下方式获得:
objectName.methodName();
在上面的语句,还有一个对象名称相关的三个方法名。这个怎么用?
eElement.getElementsByTagName
将在该对象上返回一个对象.item(0)
将返回调用.getChildNodes()
实际上是最后一个对象在另一个对象
object.method()
,但如果你有多个这样的电话,你可以像你的例子那样链接他们。 只要你不过度,它可以产生更具可读性的代码,它可以保持紧凑。
没有这么多嵌套链接,我会建议 –
@BrianAgnew谢谢,我纠正它。 –
@SoboLAN非常感谢。这非常全面。 –
对eElement.getElementsByTagName(sTag)
的调用返回一些对象。之后,在此对象上调用item(0)
。等等。换句话说,上面的语句相当于
SomeObject so = eElement.getElementsByTagName(sTag);
OtherObject oo = so.item(0);
NodeList nlList = oo.getChildNodes();
这种技术被称为method chaining,并且它可以是非常有用的 - 如果不是过头 - 在使代码更简洁和可读性。
它的一种特殊形式 - 在一些框架中广泛使用,例如Hibernate--在同一对象上链接方法调用,例如
SomeObject o = new SomeObject().setFoo(1).setBar("boo").setBaz(42);
这比
SomeObject o = new SomeObject();
o.setFoo(1);
o.setBar("boo");
o.setBaz(42);
,如果你没有与所需参数的构造函数,你肯定需要可以说是更紧凑。但是,即使这样一个构造函数是可用的,可能有人会说
SomeObject o = new SomeObject(1, "boo", 42);
比方法链接成语的可读性。唉,Java(与C#不同)在方法调用中没有命名参数。
+1。它看起来很像Builder模式。 –
@SoboLAN,的确,我只是不想在OP上一次扔太多新东西:-) –
如果objectName.methodName()
返回一个对象,那么你可以调用该对象的方法,例如, objectName.methodName().anotherMethod()
。这只是方法调用的简单链接。
上面的语句执行以下步骤:
1)在变量eElement它的类型元素 - 让所有标签与雄鹿的名称。此方法返回一个NodeList
2)在返回的NodeList中 - 从列表中获取第一项(0)。这会返回一个节点。
3)在返回的节点上 - 获取其所有子节点,它返回一个NodeList并将其分配给nlList。
如果一个方法返回一个对象,你可以在返回的对象上保持调用方法,不管你想要去的深度如何。只要生成的方法返回您正在尝试分配的类型的对象。
objectName.methodName();
还可以返回一个对象引用(只要其返回类型不是“无效”),所以它实际上是:
objectRef = objectName.methodName();
第二种方法呼叫是由所述第一返回的对象上。所以,在你的榜样
eElement.getElementsByTagName(sTag).item(0).getChildNodes();
一个对象被的getElementsByTagName(牡鹿)和项目返回(0)被称为上。第二个方法调用返回的对象,然后调用getChildNodes()。
每种方法都适用于前面的语句的返回值,例如
obj.getA().getB().getC();
表示您在obj上致电getA()
。返回一个对象A,然后您在上调用getB()
生成的对象A - 而不是原始的obj
。
它类似于
temp1 = obj.getA();
temp2 = temp1.getB();
temp3 = temp2.getC();
,但没有临时变量。
的缺点是,它更难以调试,因为你没有中间变量,也许更脆弱(如果,例如getA()
返回null,整个声明炸毁,你不能轻易告诉其中,因为堆栈跟踪仅包含行号)。
所有具有名称 “STAG” 节点从eElement
eElement.getElementsByTagName(STAG)
从中检索,第一个被选择
eElement.getElementsByTagName( sTag).item(0)
来自该第一节点的所有孩子现在都在nlList
NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes();
您好Martin。感谢您的解释。我对此有一个后续查询。如果没有ChildNode,nlList将会是什么? –
嗨,根据[this](http://docs.oracle.com/javase/1.4.2/docs/api/org/w3c/dom/Node.html),它将是一个空的nodeList – MartinM
eElement是什么类型? – npinti
使用IDE并通读关联的Javadoc。 3个方法名称与一个对象名称没有关联,这些方法与其他方法返回的对象相关联。 – ping
如果这是一个不好的问题,为什么有这么多好的答案? :) @Downvoters:请让rohit知道他/她可以改进什么。 – Zeemee