# Interfaces bei StAX



## AndiE (15. Dez 2012)

Ich habe in einem Beipsiel zu "StAX" diesen Codesnippet


```
package de.vogella.xml.stax.read;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.EndElement;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;

import de.vogella.xml.stax.model.Item;

public class StaXParser {
  static final String DATE = "date";
  static final String ITEM = "item";
  static final String MODE = "mode";
  static final String UNIT = "unit";
  static final String CURRENT = "current";
  static final String INTERACTIVE = "interactive";

  @SuppressWarnings({ "unchecked", "null" })
  public List<Item> readConfig(String configFile) {
    List<Item> items = new ArrayList<Item>();
    try {
      // First create a new XMLInputFactory
      XMLInputFactory inputFactory = XMLInputFactory.newInstance();
      // Setup a new eventReader
      InputStream in = new FileInputStream(configFile);
      XMLEventReader eventReader = inputFactory.createXMLEventReader(in);
      // Read the XML document
      Item item = null;

      while (eventReader.hasNext()) {
        XMLEvent event = eventReader.nextEvent();

        if (event.isStartElement()) {
          StartElement startElement = event.asStartElement();
          // If we have a item element we create a new item
          if (startElement.getName().getLocalPart() == (ITEM)) {
            item = new Item();
            // We read the attributes from this tag and add the date
            // attribute to our object
            Iterator<Attribute> attributes = startElement
                .getAttributes();
            while (attributes.hasNext()) {
              Attribute attribute = attributes.next();
              if (attribute.getName().toString().equals(DATE)) {
                item.setDate(attribute.getValue());
              }

            }
          }

          if (event.isStartElement()) {
            if (event.asStartElement().getName().getLocalPart()
                .equals(MODE)) {
              event = eventReader.nextEvent();
              item.setMode(event.asCharacters().getData());
              continue;
            }
          }
          if (event.asStartElement().getName().getLocalPart()
              .equals(UNIT)) {
            event = eventReader.nextEvent();
            item.setUnit(event.asCharacters().getData());
            continue;
          }

          if (event.asStartElement().getName().getLocalPart()
              .equals(CURRENT)) {
            event = eventReader.nextEvent();
            item.setCurrent(event.asCharacters().getData());
            continue;
          }

          if (event.asStartElement().getName().getLocalPart()
              .equals(INTERACTIVE)) {
            event = eventReader.nextEvent();
            item.setInteractive(event.asCharacters().getData());
            continue;
          }
        }
        // If we reach the end of an item element we add it to the list
        if (event.isEndElement()) {
          EndElement endElement = event.asEndElement();
          if (endElement.getName().getLocalPart() == (ITEM)) {
            items.add(item);
          }
        }

      }
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (XMLStreamException e) {
      e.printStackTrace();
    }
    return items;
  }

}
```

Er funktioniert auch. Für mich ist aber nicht klar, wie. 

Nach der SDK sind u.a. XMLEvent , StartEvent Interfaces. 

Meine Frage ist nun, wie es möglich ist, Inferfaces als Rückgabewert zu übergeben, oder methoden in Interfaces über den Interfacenamen aufzurufen. Typisch wird das doch über die Klassen gtan, wo die Interfaces implementiert sind. In der SDK findet man nur, dass das Super-Interface "XMLStreamConstants" in der Klasse "StreamReaderDelegate" implementiert ist.


----------



## AndiE (16. Dez 2012)

Lösung gefunden!! 


```
interface inter {
...
}

class klasse implements inter {
...
}

public void main() {
//klassischer Aufruf
klasse k= new klasse();

// geht auch

inter i = new klasse();
}
```

Ist ja auch irgendwo logisch, weil Klasse und Interface nach außen identische Signaturen der Klasse zeigen.

Im Falle von StAX werden die Interfaces XML usw. von Interator geerbt, weil das XML-File zu einer Liste von Events umgewandelt wird. also war ich ziemlich am Urschleim, der Dekleration von Containern. Ich habe einen Beispielcode gefunden, wo Iterator ausprogrammiert wurde- mit dem Ablauf wie oben dargestellt.


----------



## Ullenboom (16. Dez 2012)

Das ist eine schöne Abstraktion, die man auch bei anderen Java-APIs findet, etwa bei JDBC. Im Fall von StAX ist eine Zeile besonders interessant:

XMLInputFactory inputFactory = XMLInputFactory.newInstance();

Hier wird die Fabrik gefragt, und alles andere ist dann abstrahiert über die Schnittstellen-Typen.

Als Übung kann ich jedem nur empfehlen, so etwas mal selbst für ein kleines Beispiel zu implementieren.

Die Steigerung: Sich einmal die Fabrik genauer anzuschauen, denn das ist natürlich konfigurierbar.


----------

