[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Offen gebliebene Fragen in der Vorlesung



Hallo,

in der Vorlesung sind noch zwei Fragen offen geblieben:
1. Wie geht das mit der ConcurrentModificationException beim Iterator
2. Wie sieht es mit der Aenderbarkeit der List von
Arrays.toList(Object[] o) aus

Zu 1:
Die entsprechenden Klassen, die einen Iterator liefern koennen besitzen
eine Instanzvariable in der sie zaehlen, wie oft sie geandert worden
sind.
Diese Variable wird immer einen hochgezaehlt, wenn man add() remove()
etc. macht.
Der iterator merkt sich in einer ExpectedModCount Variable bei der
Instantiierung den Zustand den die entsprechende Klasse haben muss.
das remove wird einfach durchgeschleust und der ExpectedModCount um eins
hochgezaehlt. Dadurch, dass remove in der entsprechenden Klasse auch
hochgezaehlt wird ist beim naechsten durchlauf alles in Butter.
Wenn man remove direkt anspricht, dann merkt es der Iterator nicht und
die Zaehler stimmer nicht ueberein -> Concu...Exce...

Zu 2:
Das ist alles ein wenig verwirrend. toList(Object[] o) sagt einfach
return new ArrayList(o);

Dann schaut man natuerlich in ArrayList und stellt fest, dass die Klasse
gar keinen entsrpechenden Konstruktor hat ;-( vielleicht ist das ja
alles nur getuerkt und Object ist ja von den Konstruktoren am dichtesten
beim Collection Konstruktor.
Das heisst wir werden hinters Licht gefuehrt und Object[] sind in
wriklichkeit Collection !!! BLoede Idee ;-(
Loesung:
Arrays hat eine innere Klasse, die ungluecklicherweise auch ArrayList
heisst ;-)
Diese ArrayList extends AbstractList
AbstractList ist so gebaut, dass wenn man add machen will eine
UnsupportedOperationException geschmissen wird.
Dadurch kann man an der Liste aus dem Object[] wirklich nicht drehen und
alles ist super ;-)

Gruesse Elmar