Toon posts:

[Java] Manier van vector overdracht in een Applet

Pagina: 1
Acties:

Verwijderd

Topicstarter
Heb een paar dagen geleden gepost dat mijn Applet steeds bleef hangen op bepaalde punten. Het probleem lijkt over te zijn, maar ik snap niet waarom. Kan iemand het me uitleggen?

De client krijgt een String met elementen toegestuurd van de server en deze String wordt omgezet in een Vector (doet niet ter zake hoe en waarom). Als de data omgezet is in een Vector moet elk element van deze vector worden toegevoegd aan iets (bijv een List in onderstaand voorbeeldcode).

Oude manier, die SOMS "hangen" veroorzaakte van de applet:
Java:
1
2
3
4
5
6
7
8
//myList is een List bijvoorbeeld
public void setData(Vector vector)
{
    for(int  i = 0; i < vector.size(); i++)
    {
         myList.add((String)vector.elementAt(i));
    }
}

Deze methode heb ik nu vervangen door:
Java:
1
2
3
4
5
6
public void setData(Vector vector)
{
    Enumeration e = vector.elements();        
    String s;
    for(; e.hasMoreElements() && (s = (String)e.nextElement()) != null; myList.add(s));   
}

En nu gaat alles prima. Ik zoek naar een verklaring :)

  • momania
  • Registratie: Mei 2000
  • Laatst online: 00:32

momania

iPhone 30! Bam!

Werd die Vector misschien in een anders stuk code nog gebruikt, terwijl je de setData methode aan het uitvoeren was?
Ik kan me voorstellen dat wanneer in de for lus de Vector.size() geevalueerd
wordt en jij daarna er een zooitje data uitgooit in een andere methode,
de getElementAt(i) nog wel eens vreemde resultaten kan geven...

Bij de Enumeration heb je eigenlijk een kopietje getrokken van je Vector en
hebben verdere modificaties aan de Vector geen effect op de setData methode,
omdat die nu de data uit de Enumeration haalt.

[ Voor 76% gewijzigd door momania op 13-03-2003 16:29 ]

Neem je whisky mee, is het te weinig... *zucht*


Verwijderd

Topicstarter
Ja het zou kunnen, maar in die paar milliseconden dat ik die vector opvraag veranderd ie niet lijkt me...ik ga wel ff rondsnuffelen

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

momania schreef op 13 March 2003 @ 16:22:
Bij de Enumeration heb je eigenlijk een kopietje getrokken van je Vector en
hebben verdere modificaties aan de Vector geen effect op de setData methode,
omdat die nu de data uit de Enumeration haalt.
Er wordt geen copy gemaakt van de data. Een iterator/Enumerator bied je een ontkoppeling over de gebruikte collectie structuur en de traversal, maar je praat nog steeds met die structuur. Iedere verandering in de iterator brengt ook een verandering in de collectie voort.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public Enumeration elements() {
    return new Enumeration() {
        int count = 0;

        public boolean hasMoreElements() {
        return count < elementCount;
        }

        public Object nextElement() {
        synchronized (Vector.this) {
            if (count < elementCount) {
            return elementData[count++];
            }
        }
        throw new NoSuchElementException("Vector Enumeration");
        }
    };
    }



EN verder:

code:
1
for(; e.hasMoreElements() && (s = (String)e.nextElement()) != null; myList.add(s));

Dit is gruwelijk.

maak dit er dan van:

code:
1
2
3
for(Iterator itt = vector.iterator();itt.hasNext();){
      list.add((String)itt.next());
}

[ Voor 45% gewijzigd door Alarmnummer op 13-03-2003 16:59 ]