1
NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes();

我是 JAVA 的新手。谁能好心解释一下上述语句的结构?

我了解可以通过以下方式访问实例的方法:

objectName.methodName();

在上面的语句中,一个对象名关联了三个方法名。这是如何运作的?

4

7 回答 7

8
  • eElement.getElementsByTagName将返回一个对象
  • 然后在那个对象上调用.item(0)它将返回另一个对象
  • 在你调用的最后一个对象上.getChildNodes()

事实上,一个方法可以通过做调用object.method(),但如果你有多个这样的调用,你可以像在你的例子中那样链接它们。

只要您不过度使用它,这可以使代码更具可读性,并使其保持紧凑。

于 2012-06-28T08:30:48.057 回答
4

调用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# 不同)在方法调用中没有命名参数。

于 2012-06-28T08:31:24.887 回答
3

每个方法都对前一条语句的返回值起作用,例如

   obj.getA().getB().getC();

意味着你调用getA()了obj。这将返回一个对象 A,然后您调用getB()结果对象 A - 而不是原来的obj.

它类似于

   temp1 = obj.getA();
   temp2 = temp1.getB();
   temp3 = temp2.getC();

但没有临时变量。

缺点是调试更加困难,因为您没有中间变量,而且可能更脆弱(例如,如果getA()返回 null 则整个语句会爆炸,并且您无法轻易分辨出哪里,因为堆栈跟踪包含单独的行号)。

于 2012-06-28T08:32:50.803 回答
2

上述语句按以下步骤执行:

1) 在元素类型的变量 eElement 中 - 获取名称为 sTag 的所有标签。此方法返回一个 NodeList

2) 在返回的 NodeList 中 - 从列表中获取第一项 (0)。这将返回一个节点。

3) 在返回的节点上 - 获取其所有子节点,它返回一个 NodeList 并将其分配给 nlList。

在方法返回对象的地方,您可以继续在返回的对象上调用方法,无论您想走多远。只要结果方法返回您尝试分配的类型的对象。

于 2012-06-28T08:31:51.087 回答
1
  1. 从 eElement 中检索所有名称为“sTag”的节点

    eElement.getElementsByTagName(sTag)

  2. 从他们那里,第一个被选中

    eElement.getElementsByTagName(sTag).item(0)

  3. 来自第一个节点的所有子节点现在都在 nlList

    NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes();

于 2012-06-28T08:33:35.307 回答
0

如果objectName.methodName()返回一个对象,那么您可以调用该对象的方法,例如objectName.methodName().anotherMethod(). 它只是一个简单的方法调用链接。

于 2012-06-28T08:31:43.297 回答
0
objectName.methodName();

也可能返回一个对象引用(只要它的返回类型不是'void'),所以它确实是:

objectRef = objectName.methodName();

第二个方法调用在第一个返回的对象上。所以在你的例子中

eElement.getElementsByTagName(sTag).item(0).getChildNodes();

getElementsByTagName(sTag) 返回一个对象,并在其上调用 item(0)。第二个方法调用返回的对象,然后调用了 getChildNodes() 。

于 2012-06-28T08:32:41.640 回答