iterator instanziieren!

Status
Nicht offen für weitere Antworten.

dermoritz

Bekanntes Mitglied
ich baue grad eine funktion die einen iterator ausgeben soll. aber irgendwie kann ich den iterator/ die rückgabe variable nicht instanziieren.
d.h.

Code:
Iterator variables=new Iterator();
oder

Code:
Iterator<?> variables=new Iterator<?>();

funktioniert nicht.

im detail sieht das ganze so aus:

Code:
private Iterator<?> getAttributes(Element element){
		Iterator<?> activetags =element.getChildren("activetag").iterator();
		Iterator<?> variables=new Iterator<?>(); //funzt nich :-(
		while (activetags.hasNext()) {
			Element activetag = (Element) activetags.next();
			if (activetag.getAttributeValue("tagtype").equalsIgnoreCase("Attributes")){
				variables = activetag.getChildren("VARIABLE").iterator();
				
			}
		}
		return variables;
	}

"Element" ist eine klasse aus jdom - es geht hier also um xml. ich würde gerne variables mit einem leeren iteraor (nicht null!) vorbelegen.

danke im voraus
 
Iterator ist ein Interface. Du brauchst eine konkrete Implementierung zum Instanzieren.
Diese Implementierung musst du selbst liefern
 
ein Interface kannst du nicht instanziieren, aber eine Dummy-Klase schreiben
Code:
        Iterator<?> variables=new Iterator<Object>() {

            public boolean hasNext()
            {
                return false;
            }

            public Object next(){
               return null;
            }

            public void remove()
            {
            }
     };
null wäre vielleicht doch besser 😉
 
du willst einen Iterator zurück geben?

das kannst du so machen

Code:
	private Iterator getAttributes(Element element){ 

		return new Iterator(){ 

			public boolean hasNext() {
				//hier deine Verhalten
				return false;
			}

			public Object next() {
				//hier deine Verhalten
				return null;
			}

			public void remove() {
				//hier deine Verhalten

			}
		};
	}
 
danke für die schnellen antworten,

das problem mit der null ist eben die möglich null pinter exceptions wenn man sie nicht abfängt. wenn die funktion einen leeren iterator zurückgeben könnte wäre das besser.

kann man eventuell mit einem listen iterator instanzieren und dann überschreiben -mit welchem iterator auch immer? ich glaube sogar jdom liefert listen bzw. würde ich eine funktion benutzt die ein lsite liefert und bilde damit den operator.
ich weiß natürlich nicht welche art von liste diese funktion liefert. kann man damit einen iterator instanziieren oder muss man auch eine konkrete implementierung der liste wählen?

wie gut ist z.b. diese idee:

Code:
Iterator<?> variables=new ArrayList().iterator();
 
naja der iterator soll ja nicht irgendwas mchen, sondern über die attribute deines elementes itterieren

mach eine eigene Klasse
 
und was haltet ihr davon (verwendet null):

Code:
private Iterator<?> getAttributes(Element element){
		Iterator<?> activetags =element.getChildren("activetag").iterator();
		Iterator<?> variables=null;
		while (activetags.hasNext()) {
			Element activetag = (Element) activetags.next();
			if (activetag.getAttributeValue("tagtype").equalsIgnoreCase("Attributes")){
				variables = activetag.getChildren("VARIABLE").iterator();
			}
		}
		if( variables==null){
			variables=new ArrayList<Object>().iterator();
		}
		return variables;
	}
 
ich finde das ganz gut, noch besser

Collections.EMPTY_LIST.iterator();

allerdings wird dann immer noch immer ein neues Iterator-Objekt angelegt,
wenn du ganz sparsam sein willst, dann am Anfang einen davon in einer statischen Variable ablegen,
 
danke, d.h. so:?

Code:
private Iterator<?> getAttributes(Element element){
		Iterator<?> activetags =element.getChildren("activetag").iterator();
		//to get an empty iterator as default
		Iterator<?> variables= Collections.EMPTY_LIST.iterator();
		while (activetags.hasNext()) {
			Element activetag = (Element) activetags.next();
			if (activetag.getAttributeValue("tagtype").equalsIgnoreCase("Attributes")){
				variables = activetag.getChildren("VARIABLE").iterator();
			}
		}
		return variables;
	}

das ein objekt angelegt wird sobal diese funktion aufgerufen wird ist ja erwünscht. nur ist dieser iterator eben entweder leer oder eben nicht. oder was hast du mit dem statischem wert gemeint?
 
Ein statisches Feld mit einer anonymen Klasse für einen leeren Iterator erstellen und immer diese Instanz zurückliefern könnte Abhilfe schaffen...

Code:
  private static Iterator EMPTY_ITERATOR = new Iterator() {
    public void remove() {
      throw new UnsupportedOperationException();
    }
    public boolean hasNext() {
      return false;
    }
    public Object next() {
      throw new NoSuchElementException();
    }
  };
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben