Удалить повторяющийся код в 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
{
}
Другие вопросы по тегам