Вопрос по java, eclipse, refactoring – Как реорганизовать константы для перечислений в Eclipse?

11

Как я могу реорганизовать константы Java в перечисления с помощью 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, яя слишком стар, чтобы изменить вредные привычки ;-)

В таких случаях заменой регулярных выражений также является хорошим (чтобы увидеть) решение. Joop Eggen
Эти константы, уровень класса или уровень проекта? Unni Kris
@UnniKris константы уровня класса. remipod
+1 Я не уверен, что другие IDE также имеют эту функцию. Peter Lawrey
Там'затмениеошибка на этом. Raffi Khatchadourian

Ваш Ответ

2   ответа
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 (enum), код вылетает при созданииm, Рефакторинг никогда не будет успешным!

Я хотел бы извлечь частную константу класса в класс enum (и потенциально сделать ее не частной). Я ценю ваш ответ. remipod
@artbristol переименование не меняет внешнее поведение, так что все в порядке Peter Rader
@PeterRader, можешь ли ты объяснить, что ты имеешь в виду?внешнее поведение »? artbristol
Переименование поля, метод переименования и т. Д. Могут вызывать такие коллизии, и Eclipse их поддерживает. OK artbristol
3

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

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

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

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

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

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

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

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

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

Шаг 7a Измените подпись метода, чтобы добавить Enum в качестве параметра.

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

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

Шаг 7d Измените метод Подпись, чтобы удалить старую константу.

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

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

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

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

Шаг 9c Измените метод Signature, чтобы удалить значение из конструктора enum.

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

Например:

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 Создайте 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 Измените метод Signiture, чтобы добавить 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 () в логической логике определите, можно ли вместо этого использовать enum.

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

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

    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);
}

}

Похожие вопросы