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