NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes();
我是 JAVA 的新手。谁能好心解释一下上述语句的结构?
我了解可以通过以下方式访问实例的方法:
objectName.methodName();
在上面的语句中,一个对象名关联了三个方法名。这是如何运作的?
eElement.getElementsByTagName
将返回一个对象.item(0)
它将返回另一个对象.getChildNodes()
事实上,一个方法可以通过做调用object.method()
,但如果你有多个这样的调用,你可以像在你的例子中那样链接它们。
只要您不过度使用它,这可以使代码更具可读性,并使其保持紧凑。
调用eElement.getElementsByTagName(sTag)
返回一些对象。之后,item(0)
在此对象上调用。等等。换句话说,上面的语句等价于
SomeObject so = eElement.getElementsByTagName(sTag);
OtherObject oo = so.item(0);
NodeList nlList = oo.getChildNodes();
这种技术称为方法链,它在使代码更简洁和可读方面非常有用——如果不是过度使用的话。
它的一种特殊形式 - 在某些框架中广泛使用,例如 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# 不同)在方法调用中没有命名参数。
每个方法都对前一条语句的返回值起作用,例如
obj.getA().getB().getC();
意味着你调用getA()
了obj。这将返回一个对象 A,然后您调用getB()
结果对象 A - 而不是原来的obj
.
它类似于
temp1 = obj.getA();
temp2 = temp1.getB();
temp3 = temp2.getC();
但没有临时变量。
缺点是调试更加困难,因为您没有中间变量,而且可能更脆弱(例如,如果getA()
返回 null 则整个语句会爆炸,并且您无法轻易分辨出哪里,因为堆栈跟踪包含单独的行号)。
上述语句按以下步骤执行:
1) 在元素类型的变量 eElement 中 - 获取名称为 sTag 的所有标签。此方法返回一个 NodeList
2) 在返回的 NodeList 中 - 从列表中获取第一项 (0)。这将返回一个节点。
3) 在返回的节点上 - 获取其所有子节点,它返回一个 NodeList 并将其分配给 nlList。
在方法返回对象的地方,您可以继续在返回的对象上调用方法,无论您想走多远。只要结果方法返回您尝试分配的类型的对象。
从 eElement 中检索所有名称为“sTag”的节点
eElement.getElementsByTagName(sTag)
从他们那里,第一个被选中
eElement.getElementsByTagName(sTag).item(0)
来自第一个节点的所有子节点现在都在 nlList
NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes();
如果objectName.methodName()
返回一个对象,那么您可以调用该对象的方法,例如objectName.methodName().anotherMethod()
. 它只是一个简单的方法调用链接。
objectName.methodName();
也可能返回一个对象引用(只要它的返回类型不是'void'),所以它确实是:
objectRef = objectName.methodName();
第二个方法调用在第一个返回的对象上。所以在你的例子中
eElement.getElementsByTagName(sTag).item(0).getChildNodes();
getElementsByTagName(sTag) 返回一个对象,并在其上调用 item(0)。第二个方法调用返回的对象,然后调用了 getChildNodes() 。