Re: Generics
Andreas Leitgeb wrote:
Lew <lew@lewscanon.com> wrote:
Andreas Leitgeb wrote:
PS2: If I need to deal with the capacity of a synchronized array-like
Collection, how would I do this with ArrayList and
Collections.synchronized*What* ?
What do you mean, "to deal with the capacity of a ... Collection"?
I meant, I had a look at the Javadoc for ArrayList and skimmed over
those of its methods that aren't specified by interfaces. Only
those that deal with capacity (querying and setting) are specific
Well, setting, anyway.
to ArrayList. Plus there is also removeRange(), which it inherits
from AbstractList, and thus also isn't available through List-API.
Vector also offers these features.
While I'm not judging the practical value of these, it seems like
Vector was the only threadsafe collection that had removeRange
and a means to get/set the capacity in case a known large number
of items needs to be added, to avoid multiple incremental
re-allocations.
Why do people insist on calling Vector "thread safe"? Having synchronized
methods doesn't make it thread safe.
If you set the capacity then add items, you need to explicitly synchronize on
the Vector anyway. Individual methods' synchronization doesn't extend through
multiple method calls. There's no advantage to Vector here.
It also happens that removeRange() is a protected method, so relying on it
forces you to extend AbstractList or a subclass. This is extra work that,
from what you've indicated, doesn't solve your synchronization problem. Plus
now you have to maintain an extra class instead of simply relying on the Java
API. Work you'd avoid by using ArrayList and synchronizing explicitly, since
you have to anyway.
I'd just use an ArrayList variable (for the extra methods List doesn't
support), and explicitly synchronize.
--
Lew