Between interfaces and enums, which is better for declaring constants? Why is it so?
If there is a reason for your constants to have a specific type, if they need some kind of behavior (i.e., methods), or if they are composites of other values, enum
s are the way to go.
For example, let's assume you're implementing a card game and you want to represent values and suits:
enum Rank {
ACE, TWO, THREE, FOUR, FIVE, SIX, SEVEN,
EIGHT, NINE, TEN, JACK, QUEEN, KING;
}
enum Suit { SPADES, CLUBS, DIAMONDS, HEARTS }
There, it's now impossible to create cards with bogus suits or ranks.
Sometimes, though, you are just interested in having a bunch of frequently used values declared somewhere. In that case, putting them in an enum
would just be unnecessary effort, since these constants are just a tool to save us from remembering all the decimals of, say, π when we are calculating the circumference of a circle, or something. Which looks better?
// Using enum:
enum MathConstant {
PI(3.14159265358979323846), E(2.7182818284590452354);
private final double value;
MathConstant(double v) { value = v; }
public double value() { return value; }
}
// Usage:
double circumference = MathConstant.PI.value() * diameter;
// Using a constant class:
final class MathConstants {
private MathConstants() { throw new UnsupportedOperationException(); }
public static final double PI = 3.14159265358979323846,
E = 2.7182818284590452354;
}
// Usage:
double circumference = MathConstants.PI * diameter;
As for interfaces: Never put constants in an interface. The "constant interface" pattern is bad (justification), and the only argument to use it has been rendered invalid since import static
was added to Java.