Re: constructing a constant HashMap
On Sun, 16 Oct 2011, B1ll Gat3s wrote:
On 16/10/2011 1:07 AM, Patricia Shanahan wrote:
Roedy Green wrote:
What is your preferred way of building a HashMap when all the values
are known at compile time?
If the map is a field, I often use an instance or static initializer
immediately after the map's declaration:
Map<String,String> myMap = new HashMap<String,String>();
{
myMap.put("aaa", "bbb");
...
}
For static final variables (suggested by "all the values are known at
compile time"), i would suggest a slight variation:
static final Map<String,String> myMap;
static {
Map<String,String> tmpMap = new HashMap<String,String>();
tmpMap.put("aaa", "bbb");
myMap = Collections.unmodifiableMap(tmpMap);
}
This works in ANY setting where an expression of type Map<String,String> is
appropriate:
new HashMap<String,String> () {
{
put("aaa", "bbb");
...
}}
This is called a 'double brace initializer', and it is a very useful but
also highly surprising construct (i love dropping one in front of my pair
when pair programming, and watching their brains trying to work out what's
going on - it takes a while to realise it's not a special syntax, just a
combination of two other bits of syntax). See:
http://c2.com/cgi/wiki?DoubleBraceInitialization
I use this form a lot in unit tests, when i need to set up a map quickly,
but less so in 'real' code. It creates lots of anonymous subclasses, which
i am nervous about doing.
tom
--
So the moon is approximately 24 toasters from Scunthorpe.