为什么可以在另一个方法上调用方法?

时间:2012-06-28 08:27:28

标签: java oop object methods

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

我是JAVA的新手。任何人都可以善意地解释上述陈述的结构吗?

我知道可以通过以下方式访问实例的方法:

objectName.methodName();

在上面的语句中,有三个方法名称与一个对象名称相关联。这是如何工作的?

7 个答案:

答案 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)

  1. 从eElement

    中检索名称为“sTag”的所有节点

    eElement.getElementsByTagName(STAG)

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

    eElement.getElementsByTagName(STAG).item(0)

  3. 来自该第一个节点的所有孩子现在都在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()。