Удалить повторяющийся код в Java
class A extends ApiClass
{
public void duplicateMethod()
{
}
}
class B extends AnotherApiClass
{
public void duplicateMethod()
{
}
}
У меня есть два класса, которые расширяют различные классы API. Два класса имеют несколько дублирующих методов (один и тот же метод повторяется в обоих классах) и как удалить это дублирование?
редактировать
ApiClass и AnotherApiClass не находятся под моим контролем
5 ответов
Звучит как случай для "Стратегического паттерна".
class A extends ApiClass {
private ClassContainingDupMethod strategy;
}
class N extends AnotherApiClass {
private ClassContainingDupMethod strategy;
public methodCallingDupMethod(){
strategy.dupMethod();
}
}
class ClassContainingDupMethod{
public dupMethod(){;}
}
Или dupMethod унаследован от классов Api?
В зависимости от кода вы можете сделать что-то вроде:
public class Util
{
public static void duplicateMethod()
{
// code goes here
}
}
а затем просто вызовите два других метода duplicateMethods. Таким образом, код не будет дублирован, но будет имя метода и вызов Util.duplicateMethod.
Если бы код в Util.duplicateMethod нуждался в доступе к переменным экземпляра / класса класса A и B, это не сработало бы так хорошо, но это могло бы быть сделано (дайте мне знать, если вам это нужно).
РЕДАКТИРОВАТЬ (на основе комментариев):
С переменными экземпляра это становится менее симпатичным... но может быть сделано. Что-то вроде:
interface X
{
int getVar();
void setVar(A a);
}
class A
extends ApiClass
implements X
{
}
class B
extends AnotherApiClass
implements X
{
}
class Util
{
public static void duplicateMethod(X x)
{
int val = x.getVal();
x.setVal(val + 1);
}
}
Таким образом, для каждой переменной, к которой вам нужен доступ, вы должны создать метод для получения (и установить при необходимости). Мне не нравится этот способ, так как он делает методы get / set общедоступными, что может означать, что вы делаете вещи доступными, которые вы не хотите быть доступными. Альтернативой было бы сделать что-то с помощью рефлексии, но я бы хотел этого еще меньше:-)
Дублирующиеся методы, которые полагаются на переменные-члены, также подразумевают дублирующиеся переменные-члены - и это начинает пахнуть как слишком большие классы. Как бы выглядели эти конкретные переменные-члены с помощью метода (ов), если бы вы извлекли их в их собственный класс, а затем скомпоновали этот класс в другие ваши классы? Предпочитаю композицию наследованию.
Вам необходимо объединить классы в один объект, а затем все классы, используя два других класса, изменить их код для использования одного класса.
class BaseApiClass
{
public void duplicateMethod()
{
}
}
class ApiClass extends BaseApiClass
{
}
class AnotherApiClass extends BaseApiClass
{
}
class A extends ApiClass
{
}
class B extends AnotherApiClass
{
}