Re: setSize ArrayList, when will it come?
On 09.08.2011 04:16, Jan Burse wrote:
Eric Sosman schrieb:
Perhaps if you'd explain your use case in more detail
someone will have a suggestion you may find helpful.
I have only referted to the meta use case in my post.
The software refactoring use case, is replacing a synchronized
Vector by an unsychronized ArrayList in regions where no synchronization
is necessary.
This can be done in many cases, especially in all cases where Vector
instances are used through the List interface.
I actually do use setSize for a kind of sparse Vector.
Sparse in the sense that my Vector will have a couple
of holes represented by null value elements. Which
is eventually abuse of the term "sparse", but the use
case is there.
If you really need a sparse type then you could use Map<Integer,E> or
implement your own version of List<E>.
The missing thought in the reponse is the design goal
of ArrayList. They are explicitly advertised in the
class comment as unsynchronized version of Vector. It
is brainless not to honor such a design goal in a response.
This is not true. Quote: "This class is roughly equivalent to Vector,
except that it is unsynchronized."
http://download.oracle.com/javase/6/docs/api/java/util/ArrayList.html
Note the "roughly". This is the only reference to "Vector" on that doc
page (apart from the link to Vector's page).
On the other hand it is very clever to have the possibility
of turning initial design goals into requests for
enhancement. Imagine the following situation:
You go into a restaurant and order pizza,
you get your pizza without cheese, you
ask the waiter what is wrong, and the waiter
says, oh this cannot be changed, cheese has
to be ordered separately.
Brainless are we, who accept this.
Engineers at Sun might be less brainless than you think. In fact, they
probably used the chance to clean the interface. I believe the design
rationale here is that the size of a collection should only be modified
by methods which actually add or remove from the collection.
Frankly, all the efforts you spend for ranting about Sun / Oracle not
"fixing" a bug with prio "low" (and also the erroneous statement about
"sparse Vectors") could be better spent for any of these solutions:
1. Write your own version of ArrayList by inheriting AbstractList and
adding all the methods you need.
2. Writing a static helper method which uses ArrayList.ensureCapacity()
and a loop which invokes add() or removeRange() depending on whether the
new capacity is larger or smaller.
3. Do nothing. Synchronization overhead of Vector isn't too bad if it's
not used by multiple threads. After all the replacement is more like an
optimization. If you want to be sure, do the measurements.
Kind regards
robert
--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/