Re: enum or array ?
Mike Schilling wrote:
That's true. But it's quite possible (i.e. I've done it) to build a
class that mimics the code generated for Enums while allowing both
predefined values (which get static instances generated for them) plus
This is a good point. For the OP, I think what Mike is saying is
something like this:
public class Currency {
public final static Currency US = new Currency("US");
public final static Currency EUR = new Currency("EUR");
public final static Currency YUAN = new Currency("YUAN");
private String name;
private Currency( String name ) {
this.name = name;
}
}
This works almost exactly like the enum the OP proposed. It's accessed
like an enum (Currency.US) and you can't extend it (because of the
private constructor). I think that an enum in Java is pretty much
boilerplate for the above pattern.
The above code has the advantage that you can add a public constructor
and then get an extensible class.
values added at runtime (which do not.) (In fact, since the Java
code for such a class is boilerplate, I've built a tool to generate
it.) You still get many of the advantages of enums, but not all: e.g.
you can't switch on them, nor can you override methods per-value.
I'm thinking something like this. What's your pattern?
public class Currency {
private final static Currency[] defaults =
{
new Currency("US"),
new Currency("EUR"),
new Currency("YUAN"),
};
private String name;
private static CopyOnWriteArraySet<Currency> currencies;
{
currencies = new CopyOnWriteArraySet( Arrays.asList(defaults) );
}
protected Currency( String name ) {
this.name = name;
}
public void addCurrencies( Currency[] c ) {
currencies.addAll( Arrays.asList(c) );
}
public Set<Currency> getCurrencies() {
return Collections.unmodifiableSet( currencies );
}
}