Интерфейсы и перечисления - PullRequest
20 голосов
/ 27 марта 2010

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

Ответы [ 4 ]

13 голосов
/ 27 марта 2010

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

5 голосов
/ 27 марта 2010

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

2 голосов
/ 27 марта 2010

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

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

0 голосов
/ 27 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...