Реализация enum для обратной совместимости

Приложение, работающее на java 1.8, должно запускаться в нескольких коробках с java 1.4. В приложении используется множество констант (их тысячи), и все реализовано с помощью функциональных перечислений. Как лучше всего сделать его обратно совместимым?

РЕДАКТИРОВАТЬ:

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

public class SomeType
{
    public enum TYPE
    {
        ERROR("allError","4"),
    INPUT("allInput","5"),
        OFFLINE("allOffline","6"),;

        private final String type;
        private final String desc;

        TYPE(String type, String desc)
        {
            this.type = type;
            this.desc = desc;
        }
        public String getType(){
            return this.type;
        }
        public String getDesc(){
            return this.type;
        }
    }
}
}

Что будет поглощено чем-то вроде

for (SomeType.TYPE type: SomeType.TYPE.values())
        {
            if(nodeValue.equalsIgnoreCase(type.getType()))
            {
                value=type.getDesc();
                break;
            }
        }

Таким образом, это никогда не будет совместимо с версией 1.4, и поэтому мне пришлось бы написать много шаблонного кода, как объяснил @Gene в предоставленной им ссылке. Поскольку существует так много классов, подобных этому, содержащих очень большой список констант, я чувствую необходимость в лучшем подходе. Итак, вопрос заключается в поиске лучшего решения.


person RBz    schedule 19.04.2016    source источник
comment
Проверьте эту ссылку stackoverflow.com/ questions / 1038321 /   -  person 11thdimension    schedule 19.04.2016
comment
В этом ответе я показал, как дублировать большую часть того, что делают перечисления (включая методы членов): stackoverflow.com/questions/4709175/. Главное, чего не дает эта техника, - это хорошо играть с switch. Но вы включаете значение скалярного члена.   -  person Gene    schedule 19.04.2016
comment
@ 11thdimension Я видел это. Но моя проблема больше, когда дело доходит до смены корпуса.   -  person RBz    schedule 19.04.2016
comment
@Gene ваш ответ объясняет это лучше. Как вы упомянули в своем ответе, я не доволен! Но я думаю, мне придется с этим жить.   -  person RBz    schedule 19.04.2016
comment
Преобразование исходного кода, генерирующее исходный код 1.4, кажется наиболее гибким. Обратные порты Enum существуют, но преобразование должно выполняться.   -  person Joop Eggen    schedule 19.04.2016


Ответы (1)


Вы можете использовать интерфейс во всех местах, где используются перечисления - таким образом вам не нужно изменять реализацию перечисления в Java 5+.

public interface Type {
   String getDesc();
   String getType();
}

Реализация интерфейса в Java 5+ будет такой же:

public enum TYPE implements Type
{
    ERROR("allError","4"),
    INPUT("allInput","5"),
    OFFLINE("allOffline","6"),;

    private final String type;
    private final String desc;

    TYPE(String type, String desc)
    {
        this.type = type;
        this.desc = desc;
    }
    public String getType(){
        return this.type;
    }
    public String getDesc(){
        return this.type;
    }
}

В Java 5 - вам нужно будет реализовать тип, используя либо Enum из apache-commons, либо пользовательскую реализацию (лучше всего было бы иметь некоторый генератор кода, который принимает перечисление и преобразует его в класс до Java 5)

Потребляющий код:

for (Type type: types)
    {
        if(nodeValue.equalsIgnoreCase(type.getType()))
        {
            value=type.getDesc();
            break;
        }
    }

где типы - это Тип []. Я не знаю, используете ли вы операторы switch, но циклы будут работать нормально.

Таким образом, вам не нужно иметь отдельный код для потребителей перечисления, но все равно нужно переписать перечисление в Enum.

person user3350351    schedule 19.04.2016