Cette classe permet de gêrer une liste d'objets dans un conteneur fonctionnant comme un vecteur. Le point intéressant est que
les références aux objets insérés sont de type faible, c'est à dire qu'elle ne gagne jamais face au GarbageCollector si la
seule Référence à un objet est un WeakReferenceVector. Cette classe est surtout utilisée pour implémenter des observers de
sorte à ce l'on ai pas à gêrer le dé-référencement des listeners pour que les objets en écoute soit libérés.
public class WeakReferenceVector
<E
> implements Iterable
<E
> {
private LinkedList
<WeakReference
<E
>> storage
= new LinkedList
<WeakReference
<E
>>();
public WeakReferenceVector
() {
}
public boolean isEmpty
() {
pack
();
return storage.
isEmpty();
}
public boolean add
(E value
) {
pack
();
return storage.
add(new WeakReference
<E
>(value
));
}
public void clear
() {
storage.
clear();
}
public boolean contains
(Object value
) {
pack
();
return storage.
contains(value
);
}
public E elementAt
(int index
) {
pack
();
return storage.
get(index
).
get();
}
public boolean removeElement
(E value
) {
pack
();
return storage.
remove(value
);
}
public int size
() {
pack
();
return storage.
size();
}
private synchronized void pack
() {
for (WeakReference
<E
> weakReference
: storage
)
if (weakReference.
get() == null)
storage.
remove(weakReference
);
}
public Iterator
<E
> iterator
() {
return new Iterator() {
int index
;
public boolean hasNext
() {
return index
< storage.
size();
}
public E next
() {
return storage.
get(index
++).
get();
}
public void remove
() {
storage.
remove(index
);
}
};
}
}
Poster un nouveau commentaire