Как реорганизовать константы для перечислений в Eclipse?

Как преобразовать константы Java в enums с помощью eclipse?

Я не нашел встроенных функций в eclipse: http://help.eclipse.org/juno/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Freference%2Fref-menu-refactor.htm

Я нашел плагин: http://code.google.com/p/constants-to-enum-eclipse-plugin/. Мне интересно, подходит ли плагин, или кто-то использует лучший подход.

Я всегда мог бы создать класс enum самостоятельно, вырезать и вставлять константы, которые утомительны в 2012 году. Пожалуйста, не указывайте мне на другую среду IDE, я слишком стар, слишком изменяю вредные привычки; -)

Ответ 1

Вот набор автоматических и ручных действий для этого рефакторинга.

Шаг 1 Инкапсулируйте поле на константах

Шаг 2 (Необязательно) Переименуйте константы. Сделайте это, если вы хотите повторно использовать имена.

Шаг 3 (Вручную) Создайте перечисление, используя значения констант. Дайте enum метод getValue, который возвращает константу.

Шаг 4 (Вручную) Замените возвращаемое значение в getters с getValue из перечисления.

Шаг 5 Вставьте геттеры. Выберите "Все ссылки" и "Объявление метода метода".

Шаг 6 Встройте константы. Выберите "Все ссылки" и "Удалить объявление константы".

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

Шаг 7 Для каждого метода, который использует параметр enum.getValue() в качестве параметра, заменить константу передан с перечислением.

Шаг 7a Метод изменения Подпись для добавления Enum в качестве параметра.

Шаг 7b (Вручную) Передайте экземпляр enum в качестве нового параметра наряду с вызовом getValue. Убедитесь, что вы нашли все экземпляры, или будут проблемы позже.

Шаг 7c (Вручную) В методе используйте новый параметр enum вместо константы. Если вы пропустили вызов на шаге 7b, ваши тесты здесь не сработают.

Шаг 7d Метод изменения Подпись для удаления старой константы.

Шаг 8 (Вручную) Для каждого использования enum.getValue() в логической логике определите, можно ли вместо этого использовать перечисление.

Шаг 9 Если метод getValue больше не используется, его можно удалить.

Шаг 9a (Вручную) Удалить неиспользуемый метод getValue

Шаг 9b (Вручную) Удалить поле и назначение в конструкторе.

Шаг 9c Метод изменения Подпись для удаления значения из конструктора перечисления.

Шаг 9d (Вручную) Если нет других параметров, удалите конструктор перечисления.


Например:

public class Initial {
public static final String CONSTANT1 = "value1";
public static final String CONSTANT2 = "value2";

public void method(String aConstant)
{
    if(aConstant.equals(CONSTANT2))
    {
        //do something
    }
}

public void anotherMethod()
{
    method(CONSTANT1);
}

}

Шаг 1

private static final String CONSTANT1 = "value1";
private static final String CONSTANT2 = "value2";

public void method(String aConstant)
{
    if(aConstant.equals(getConstant2()))
    {
        //do something
    }
}

public void anotherMethod()
{
    method(getConstant1());
}

public static String getConstant1() {
    return CONSTANT1;
}

public static String getConstant2() {
    return CONSTANT2;
}

Шаг 2 Переименовать константы

private static final String _CONSTANT1 = "value1";
private static final String _CONSTANT2 = "value2";
...
public static String getConstant1() {
    return _CONSTANT1;
}

public static String getConstant2() {
    return _CONSTANT2;
}

Шаг 3 Create Enum

    public static enum AnEnum {
    CONSTANT1(_CONSTANT1), CONSTANT2(_CONSTANT2);

    private final String value;

    AnEnum(String aValue)
    {
        value = aValue;
    }

    public String getValue()
    {
        return value;
    }
}

Шаг 4 Замените возвращаемое значение в константных геттерах

    public static String getConstant1() {
    return AnEnum.CONSTANT1.getValue();
}

public static String getConstant2() {
    return AnEnum.CONSTANT2.getValue();
}

Шаг 5 Встройте постоянные геттеры

public void method(String aConstant)
{
    if(aConstant.equals(AnEnum.CONSTANT2.getValue()))
    {
        //do something
    }
}

public void anotherMethod()
{
    method(AnEnum.CONSTANT1.getValue());
}

Шаг 6 Встроить константы

    public static enum AnEnum {
    CONSTANT1("value1"), CONSTANT2("value2");

Шаг 7a Изменить метод Отменить добавление enum в качестве параметра.

    public void method(String aConstant, AnEnum theEnum)
    ....
    public void anotherMethod()
{
    method(AnEnum.CONSTANT1.getValue(), null);
}

Шаг 7b Передайте экземпляр enum в качестве нового параметра наряду с вызовом getValue

    public void anotherMethod()
{
    method(AnEnum.CONSTANT1.getValue(), AnEnum.CONSTANT1);
}

Шаг 7c. Новый параметр enum вместо старого переданного значения.

        if(theEnum.getValue().equals(AnEnum.CONSTANT2.getValue()))
    {

Шаг 7d Метод изменения Подпись для удаления старой константы

public void method(AnEnum theEnum)
....

public void anotherMethod()
{
    method(AnEnum.CONSTANT1);
}

Шаг 8 Для каждого использования enum.getValue() в логической логике определите, можно ли вместо этого использовать перечисление.

        if(theEnum.equals(AnEnum.CONSTANT2))
    {
        //do something
    }

Шаг 9a удалить неиспользуемый метод getValue Шаг 9b (Вручную) Удалить поле и назначение в конструкторе. Шаг 9c Измените метод Подпись, чтобы удалить значение из конструктора перечисления. Шаг 9d (Вручную) Если нет других параметров, удалите конструктор перечисления.

    public static enum AnEnum {
    CONSTANT1, CONSTANT2;
}

Итак, код выглядит следующим образом:

public class Step9d {

public static enum AnEnum {
    CONSTANT1, CONSTANT2;
}

public void method(AnEnum theEnum)
{
    if(theEnum.equals(AnEnum.CONSTANT2))
    {
        //do something
    }
}

public void anotherMethod()
{
    method(AnEnum.CONSTANT1);
}

}

Ответ 2

Рефакторинг никогда не изменяет "внешнее поведение"!

Например:

public enum Test {
    NAME1("abc");

    Test(String name) {}

    public static final String _NAME1="abc";
    public static void main(String[] args) {
        String k = Test._NAME1;
        String m = Test.NAME1;
    }
}

Если вы реорганизуете _NAME1 в NAME1 (перечисление), код выдается при создании m. Рефакторинг никогда не будет успешным!