NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes();
我是JAVA的新手。任何人都可以善意地解释上述陈述的结构吗?
我知道可以通过以下方式访问实例的方法:
objectName.methodName();
在上面的语句中,有三个方法名称与一个对象名称相关联。这是如何工作的?
答案 0 :(得分:8)
eElement.getElementsByTagName
将返回一个对象.item(0)
将返回另一个对象.getChildNodes()
实际上,可以通过执行object.method()
来调用方法,但如果您有多个这样的调用,则可以像示例一样链接它们。
只要你不过度使用它,就可以产生更易读的代码,并保持紧凑。
答案 1 :(得分:4)
对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#不同)在方法调用中没有命名参数。
答案 2 :(得分:3)
每个方法都适用于前一个语句的返回值,例如
obj.getA().getB().getC();
表示您在obj上调用getA()
。返回一个对象A,然后在生成的对象A 上调用getB()
- 而不是原始的obj
。
与
类似 temp1 = obj.getA();
temp2 = temp1.getB();
temp3 = temp2.getC();
但没有临时变量。
缺点是调试起来比较困难,因为你没有中间变量,也许更脆弱(例如getA()
返回null然后整个语句爆炸并且你不能轻易告诉在哪里,因为stacktrace只包含行号。
答案 3 :(得分:2)
以上语句按以下步骤执行:
1)在元素类型的变量eElement中 - 获取名称为sTag的所有标记。此方法返回NodeList
2)在返回的NodeList中 - 从列表中获取第一个项目(0)。这将返回一个节点。
3)在返回的节点上 - 获取其所有子节点,返回NodeList并将其分配给nlList。
当一个方法返回一个对象时,你可以继续在返回的对象上调用方法。只要生成的方法返回您尝试分配的类型的对象。
答案 4 :(得分:1)
从eElement
中检索名称为“sTag”的所有节点eElement.getElementsByTagName(STAG)
从他们那里,第一个被选中
eElement.getElementsByTagName(STAG).item(0)
来自该第一个节点的所有孩子现在都在nlList
中NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes();
答案 5 :(得分:0)
如果objectName.methodName()
返回一个对象,那么你可以在该对象上调用一个方法,例如objectName.methodName().anotherMethod()
。它只是方法调用的简单链接。
答案 6 :(得分:0)
objectName.methodName();
也可能返回一个对象引用(只要它的返回类型不是'void'),所以实际上它是:
objectRef = objectName.methodName();
第二个方法调用是第一个返回的对象。所以在你的例子中
eElement.getElementsByTagName(sTag).item(0).getChildNodes();
getElementsByTagName(sTag)返回一个对象,并在其上调用item(0)。第二个方法调用返回的对象,然后调用getChildNodes()。