Интерфейсы по сравнению с перечислениями

Между интерфейсами и перечислениями, который лучше для объявления констант? Почему это так?

20
задан The Guy with The Hat 31 January 2014 в 21:39
поделиться

4 ответа

Всегда лучше использовать Enums для объявления константы как цель интерфейсов находятся на совершенно другом уровне. Да, существует множество интерфейсов, которые имеют общедоступные статические конечные константы , но я считаю, что эксклюзивная задача enums - предоставить вам эти константы.

13
ответ дан 30 November 2019 в 01:10
поделиться

Если у ваших констант есть причина иметь определенный тип, нужно ли им какое-то поведение (например, методы), или если они являются составными частями других значений, можно использовать 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.

5
ответ дан 30 November 2019 в 01:10
поделиться

Если вы работаете с Java 5 или новее, вам подойдет Enum. Единственное исключение - если ваш список констант открыт и может быть расширен. Перечисления не могут быть расширены. Другое исключение - это одиночные значения, такие как MAX_INTEGER.

0
ответ дан 30 November 2019 в 01:10
поделиться

Интерфейсы предназначены для определения общего поведения, перечисления для определения общих значений.

Enum представляет собой реальное значение, которое можно сравнить с другим значением или легко сохранить в базе данных. У вас также может быть перечисление флагов (в C #, не знаю в Java), которое позволит вам выполнять бинарные операции над значениями перечисления (AND, OR, XOR и т. д.).

2
ответ дан 30 November 2019 в 01:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: