Ответ 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);
}
}