簡體   English   中英

您能幫我理解這個Java代碼嗎?

[英]Can you help me understand this Java code?

我正在做一個需要加載XML文件的小型項目。 我發現,擴展了DefaultHandler並使用自定義TreeRender到XML格式化為一個TreeView一個很好的示例代碼在這里 該代碼可以編譯並運行(總是有加號),並為我提供了我要尋找的起點,但是有一點我不理解。

這是我沒有得到的代碼片段:

public class XmlTreeView extends DefaultHandler {

private DefaultMutableTreeNode _base;

<snip>

@Override
public void startElement(String uri, String localName, String tagName, Attributes attr) throws SAXException {
    System.out.println("startElement: uri=" + uri + " localname=" + localName + " tagName=" + tagName );

    DefaultMutableTreeNode current = new DefaultMutableTreeNode(tagName);
    _base.add(current);
    _base = current;
    for (int i = 0; i < attr.getLength(); i++) {
      // <snip> attribute processing
    }
}

該類聲明一個名為_base的DefaultMutableTreeNode。 startElement()方法實例化一個名為current的新DefaultMutableTreeNode,然后執行

_base.add(current);
_base = current;

我所有的編程知識都告訴我,第二條語句將新對象(當前)分配給_base“變量”,從而使第一條語句無用。 但是,如果我刪除第一條語句,該代碼將無法再正常運行。 實際上,如果我刪除其中任何一條,它將不再正常工作。 這兩個語句都是元素添加到樹中所必需的。

你能告訴我這里發生了什么嗎? 我就是不明白。

提前致謝,

史蒂夫

_base是對對象的引用 當您說_base.add(current) ,您正在調用一個對該對象進行一些更改的方法。 然后您說_base = current; _base成為對另一個對象的引用。 但是第一個對象仍然在那里。 如果您在其他地方引用了它,則對它所做的任何更改仍然會影響程序的其余部分。

這些變量的命名不正確,這導致了大多數混亂。

字段_base應該被稱為currentNode ,而在startElement創建的新Node應該被稱為childNode

這是相同的代碼,但使用這些新的變量名稱重寫:

currentNode.add(childNode);
currentNode= childNode;

因此,您看到在XML文件中輸入start元素時,我們將創建一個新節點,並將其添加到XML樹結構的Object表示形式中。 我們剛剛開始的新子元素作為子元素添加到當前節點。 然后,我們更改對當前節點的引用以指向該新的子節點。 這使新的子節點成為當前節點。

我假設在代碼中未顯示,但有一個endElement ,我們在其中進行反向操作並將樹上移到currentNode的父級。

我腦海中有一段奇怪的代碼,但這就是發生的情況:

private DefaultMutableTreeNode _base;

充當該類的全局currentNode 當您調用startElement您正在執行以下操作:

DefaultMutableTreeNode current = new DefaultMutableTreeNode(tagName);
//Create a new TreeNode item based off the tagName

因此,您現在擁有:

  • _base(無孩子)

現在,您將添加到_base的子節點中,該節點是新創建的節點

_base.add(current);

現在,您已經完成了:

  • _base(無孩子)
    • 當前(孩子)

最后

_base = current;

現在你有

  • (_base的父級)(舊的base)
    • _base /當前

現在,對_base的引用指向新創建的子級。 調用endElement ,您將退出_base並返回到舊的_base

_base存儲您當前正在使用的xmlElement。 當你打電話startElement到所有通話setAttributestartElement將基於關閉此。

摘要:

這是在代碼中播放的樣子:

XmlWriter xWriter;
xWriter.startElement("NPC"); //_base becomes new node "hello"
xWriter.startAttribute("Greeting", "Hi"); //attribute is now set to _base (or greeting)
xWriter.startElement("Data"); //_base becomes new node "data"
xWriter.startAttribute("Height", "200"); //attribute is now set to _base (or data)
xWriter.endElement(); //on end element you move to parent of data, so greeting
xWriter.endElement(); //again you move to the parent

創建:

<NPC Greeting='Hi'>
  <Data Height='200'/>
</NPC>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM