2012-06-28 132 views
1
NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes(); 

我是JAVA新手。任何人都可以善意地解释上述陈述的结构吗?为什么可以用另一种方法调用方法?

我明白一个实例的方法,可以通过以下方式获得:

objectName.methodName(); 

在上面的语句,还有一个对象名称相关的三个方法名。这个怎么用?

+0

eElement是什么类型? – npinti

+1

使用IDE并通读关联的Javadoc。 3个方法名称与一个对象名称没有关联,这些方法与其他方法返回的对象相关联。 – ping

+0

如果这是一个不好的问题,为什么有这么多好的答案? :) @Downvoters:请让rohit知道他/她可以改进什么。 – Zeemee

回答

8
  • eElement.getElementsByTagName将在该对象上返回一个对象
  • 然后调用.item(0)将返回调用.getChildNodes()

实际上是最后一个对象在另一个对象

  • ,一个方法可以通过称为做object.method(),但如果你有多个这样的电话,你可以像你的例子那样链接他们。

    只要你不过度,它可以产生更具可读性的代码,它可以保持紧凑。

  • +0

    没有这么多嵌套链接,我会建议 –

    +0

    @BrianAgnew谢谢,我纠正它。 –

    +0

    @SoboLAN非常感谢。这非常全面。 –

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

    +0

    +1。它看起来很像Builder模式。 –

    +0

    @SoboLAN,的确,我只是不想在OP上一次扔太多新东西:-) –

    0

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

    2

    上面的语句执行以下步骤:

    1)在变量eElement它的类型元素 - 让所有标签与雄鹿的名称。此方法返回一个NodeList

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

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

    如果一个方法返回一个对象,你可以在返回的对象上保持调用方法,不管你想要去的深度如何。只要生成的方法返回您正在尝试分配的类型的对象。

    0
    objectName.methodName(); 
    

    还可以返回一个对象引用(只要其返回类型不是“无效”),所以它实际上是:

    objectRef = objectName.methodName(); 
    

    第二种方法呼叫是由所述第一返回的对象上。所以,在你的榜样

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

    一个对象被的getElementsByTagName(牡鹿)和项目返回(0)被称为上。第二个方法调用返回的对象,然后调用getChildNodes()。

    3

    每种方法都适用于前面的语句的返回值,例如

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

    表示您在obj上致电getA()。返回一个对象A,然后您在上调用getB()生成的对象A - 而不是原始的obj

    它类似于

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

    ,但没有临时变量。

    的缺点是,它更难以调试,因为你没有中间变量,也许更脆弱(如果,例如getA()返回null,整个声明炸毁,你不能轻易告诉其中,因为堆栈跟踪仅包含行号)。

    1
    1. 所有具有名称 “STAG” 节点从eElement

      eElement.getElementsByTagName(STAG)

    2. 从中检索,第一个被选择

      eElement.getElementsByTagName( sTag).item(0)

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

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

    +0

    您好Martin。感谢您的解释。我对此有一个后续查询。如果没有ChildNode,nlList将会是什么? –

    +0

    嗨,根据[this](http://docs.oracle.com/javase/1.4.2/docs/api/org/w3c/dom/Node.html),它将是一个空的nodeList – MartinM

    相关问题