Перечислимые типы Java: функциональность - PullRequest
3 голосов
/ 28 мая 2011

Эй, я большой поклонник использования перечисляемых типов в Java, чтобы помочь читаемости кода и ограничению недопустимых значений.Однако мне сказали, что с помощью перечислений в Java можно сделать гораздо больше, чем просто создать именованную группу возможных значений.

Может ли кто-нибудь перечислить базовую функциональность, которую позволяют перечисления Java, а также пример иливозможно, место, где я мог бы получить больше информации об этой функциональности?

Большое спасибо, Black Vegetable

РЕДАКТИРОВАТЬ: Как и предполагалось, этот вопрос должен задаваться вопросом, какие различия существуют между перечислением икласс на Java.Я не знал, что они были такими сильными?В чем же тогда различия?

Ответы [ 3 ]

4 голосов
/ 28 мая 2011

Java enum - это в основном полноценный класс.

Вы можете:

  • Объявление методов и полей
  • Реализация интерфейсов

Но вы не можете:

  • Расширение классов (поскольку enum уже неявно расширяют java.lang.Enum, а Java поддерживает только одно наследование реализации)
  • Есть общественные конструкторы

У них есть:

  • Некоторые сгенерированные компилятором методы, такие как valueOf и values
  • Некоторые дополнительные гарантии безопасности потоков (перечисление из одного элемента - рекомендуемый способ реализации синглетонов в Java)
3 голосов
/ 28 мая 2011

Различия между перечислением и обычным классом - это, прежде всего, гарантии, предоставляемые вам обработкой перечислений в JVM.

Допустим, у вас есть класс enum (MyEnum) со значениями (VALUE1 и VALUE2). Вам гарантировано, что конструктор для этого класса enum будет когда-либо выполняться только дважды в вашей JVM *, при сериализации и десериализации VALUE1 и VALUE2 вы гарантированно будете получать одни и те же объекты каждый раз, так чтобы принцип равенства объектов работал (тогда как это не будет гарантировано для других классов ... (например, "Foo" == new String("Foo") может возвращать false).

Кроме того, каждый класс enum расширяется на Enum<T extends Enum<T>>, поэтому вы можете работать с этими типами enum по мере необходимости (научитесь любить name() и valueOf()).

* Загрузчики классов - сложное дело ... да, здесь есть небольшое исключение.

2 голосов
/ 28 мая 2011

У них есть много всего, помимо того, что уже сказали другие парни.

Позвольте мне представить еще одно использование, которое вы можете найти для них. Я использую их как архетипы объектов. Таким образом, вместо отправки целого объекта по сети, я просто посылаю идентификатор архетипа. Ниже я привожу пример из простой игры, которую я пишу для забавы и практики.

public enum SimpleUnits
{
    BROTHERHOOD_ELITE_TROOPER,
    CAPITOL_FREE_MARINE,
    IMPERIAL_BLOOD_BERET;

    public static SimpleUnit getUnit(SimpleUnits unit)
    {
        SimpleUnit result = null;
//      new SimpleUnit(enumeName, hpMax, speed, CC, MW, PW, LD, ST, MV, AC, W, A, COST);
        switch(unit)
        {
            case BROTHERHOOD_ELITE_TROOPER:
                result = new SimpleUnit(BROTHERHOOD_ELITE_TROOPER.name(), 5, 0.15, 12, 12, 12, 12, 3,
                        5, 3, 2, 1, 100, "images/units/eliteTrooper.png");
                break;
            case CAPITOL_FREE_MARINE:
                result = new SimpleUnit(CAPITOL_FREE_MARINE.name(), 5, 0.15, 12, 12, 12, 12, 3,
                        5, 3, 2, 1, 100, "images/units/freeMarine.png");
                break;
            case IMPERIAL_BLOOD_BERET:
                result = new SimpleUnit(IMPERIAL_BLOOD_BERET.name(), 5, 0.15, 12, 12, 12, 12, 3,
                        5, 3, 2, 1, 100, "images/units/bloodBeret.png");
                break;
        }
        return result;
    }

    public SimpleUnit getUnit()
    {
        return SimpleUnits.getUnit(this);
    }

    public static SimpleUnit getUnit(String enumeName)
    {
        return SimpleUnits.valueOf(enumeName).getUnit();
    }
}

Надеюсь, вы найдете это полезным.

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