Hatred's Log Place

DON'T PANIC!

Dec 2, 2010 - 2 minute read - programming

Java Enums

Для тех случаев когда enum нету, к примеру, при использовании BeanShell:

http://alumnus.caltech.edu/~leif/OO/Enum.html

Подкатом небольшое дополнение и пример.

Небольшая ремарка, для BeanShell придется разносить класс и сами создания констант, к примеру так:

// Не обязательно
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/**
 Хранит описание одной записи в дополнительных действиях, а так же собирает их в перечисление
 дабы можно было использовать интерфейс коллекций для перебора при формировании списка
*/
class AdditionalActionId
{
    private static Collection all_ids = new ArrayList();

    private int    value;
    private String description;

    /**
     Конструктор, принимает ID дополнительного действия и описание (что будет в меню отображаться)
    */
    AdditionalActionId(int value, String description)
    {
        this.value       = value;
        this.description = description;

        all_ids.add(this);
    }

    /**
     Возвращает Id действия
    */
    public int toInt()
    {
        return this.value;
    }

    /**
     Возвращает описание действия
    */
    public String toString()
    {
        return this.description;
    }

    /**********************************************************************************************/
    /* Statics methods (class wide methods) ------------------------------------------------------*/
    /**********************************************************************************************/

    /**
     Получаем итератор для перебора всех ранее созданных действий
    */
    public static Iterator getIterator()
    {
        return all_ids.iterator();
    }

    /**
     Получаем количество дополнительных действий
    */
    public static int getSize()
    {
        return all_ids.size();
    }
}

/**
 Класс-обертка, для реализации некоторого подобия Enum (который не работает в BeanShell)
*/
class AdditionalActionIds
{
    private static int action = 1;

    // Перечисляем наши действия
    //public static final AdditionalActionId TARIFF_ADD_COMMON1 = new AdditionalActionId(action++, "TEST");
    //public static final AdditionalActionId TARIFF_ADD_COMMON2 = new AdditionalActionId(action++, "TEST");
    //public static final AdditionalActionId TARIFF_ADD_COMMON3 = new AdditionalActionId(action++, "TEST");
    //public static final AdditionalActionId TARIFF_ADD_COMMON4 = new AdditionalActionId(action++, "TEST");

    // Must be LAST
    public static final AdditionalActionId ABON_RECALC_ALL    = new AdditionalActionId(1000000, "Дополнительное действие");
}

// Пример перебора всех значений
/*Iterator it = AdditionalActionId.getIterator();
while (it.hasNext())
{
    action = (AdditionalActionId)it.next();
    print("ID: " + action.toInt() + ", desc: " + action.toString());
}
*/

// Пример обращения к конкретному элементу
/*AdditionalActionId action = AdditionalActionIds.TARIFF_ADD_COMMON3;
print("ID: " + action.toInt() + ", desc: " + action.toString());*/

Иначе имеем проблемы. Не знаю, бага или фича, но факт.