Если есть причина, по которой ваши константы имеют определенный тип, если им нужно какое-то поведение (например, методы), или если они являются композициями других значений, enum
s - это путь.
Например, предположим, что вы реализуете карточную игру и хотите представить значения и масти:
enum Rank {
ACE, TWO, THREE, FOUR, FIVE, SIX, SEVEN,
EIGHT, NINE, TEN, JACK, QUEEN, KING;
}
enum Suit { SPADES, CLUBS, DIAMONDS, HEARTS }
Там теперь невозможно создавать карты с поддельными мастями или рангами.
Иногда, однако, вы просто заинтересованы в том, чтобы где-то была объявлена куча часто используемых значений. В этом случае их добавление в enum
было бы просто ненужным усилием, поскольку эти константы - это всего лишь инструмент, который избавляет нас от запоминания всех десятичных знаков, скажем, π, когда мы вычисляем окружность круга или что-то еще. Что выглядит лучше?
// 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;
Что касается интерфейсов: никогда не помещайте константы в интерфейс. Шаблон «постоянный интерфейс» неверен ( justification ), и единственный аргумент, который его использует, был недействительным, поскольку import static
был добавлен в Java.