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

私はJAVAを初めて使用します。上記のステートメントの構造を説明してくれる人はいますか?

インスタンスのメソッドには、次の方法でアクセスできることを理解しています。

objectName.methodName();

上記のステートメントでは、1つのオブジェクト名に関連付けられた3つのメソッド名があります。これはどのように作動しますか?

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が返され、元のオブジェクトではなく、結果のオブジェクトAgetB()が呼び出されます。obj

に似ています

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

ただし、一時変数はありません。

欠点は、中間変数がないためデバッグが難しく、おそらくより脆弱であるということです(たとえば、getA()nullを返すと、ステートメント全体が爆発し、スタックトレースに行番号のみ)。

于 2012-06-28T08:32:50.803 に答える
2

上記のステートメントは、次の手順で実行されます。

1)タイプElementの変数eElementで、sTagという名前のすべてのタグを取得します。このメソッドはNodeListを返します

2)返されたNodeListで-リストから最初の項目(0)を取得します。これはノードを返します。

3)返されたノードで-すべての子ノードを取得します。これにより、NodeListが返され、nlListに割り当てられます。

メソッドがオブジェクトを返す場合、戻りたいオブジェクトのメソッドを呼び出し続けることができます。結果のメソッドが、割り当てようとしているタイプのオブジェクトを返す限り。

于 2012-06-28T08:31:51.087 に答える
1
  1. 「sTag」という名前のすべてのノードはeElementから取得されます

    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();

2番目のメソッド呼び出しは、最初のメソッド呼び出しによって返されたオブジェクトに対して行われます。だからあなたの例では

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

オブジェクトはgetElementsByTagName(sTag)によって返され、その上でitem(0)が呼び出されます。その2番目のメソッド呼び出しによって返されるオブジェクトは、getChildNodes()を呼び出します。

于 2012-06-28T08:32:41.640 に答える