Вынесите общую последовательность в приватный метод с Runnable, а различающиеся действия передавайте ссылками на методы. В исходнике также есть несовпадение имени второго utility-метода.
Рефакторинг повторяющегося кода в публичных методах класса
Вынесите общую последовательность в приватный метод с Runnable, а различающиеся действия передавайте ссылками на методы. В исходнике также есть несовпадение имени второго utility-метода.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В классе SomeClass есть два открытых метода (someMethod и someAnotherMethod), которые практически полностью совпадают. Единственное различие — вызов разных вспомогательных функций (doSomething и doAnotherSomethingElse). Необходимо:
- вынести общую часть в отдельный приватный метод;
- заменить дублирующий код вызовами нового метода;
- сохранить исходную функциональность.
public class SomeClass {
public void someMethod() {
System.out.println("do something 1");
System.out.println("do something 2");
SomeUtilityClass.doSomething();
System.out.println("do something 3");
System.out.println("do something 4");
}
public void someAnotherMethod() {
System.out.println("do something 1");
System.out.println("do something 2");
SomeUtilityClass.doAnotherSomethingElse();
System.out.println("do something 3");
System.out.println("do something 4");
}
static class SomeUtilityClass {
static void doSomething() {
System.out.println("do something");
}
static void doAnythingElse() {
System.out.println("do anything else");
}
}
}
Ответ
Вынесите общую последовательность в приватный метод с Runnable, а различающиеся действия передавайте ссылками на методы. В исходнике также есть несовпадение имени второго utility-метода.
public void someMethod() {
execute(SomeUtilityClass::doSomething);
}
public void someAnotherMethod() {
execute(SomeUtilityClass::doAnythingElse);
}
private void execute(Runnable action) {
System.out.println("do something 1");
System.out.println("do something 2");
action.run();
System.out.println("do something 3");
System.out.println("do something 4");
}
Использовано существующее имя doAnythingElse вместо отсутствующего doAnotherSomethingElse. Если действие бросит исключение, последние две строки не выполнятся — как в исходном коде; перенос их в finally изменил бы поведение.