удалить повторяющийся код в Java - PullRequest
2 голосов
/ 13 марта 2010
class A extends ApiClass
{
   public void duplicateMethod()
   {
   }
}    


class B extends AnotherApiClass
{
   public void duplicateMethod()
   {
   }
}

У меня есть два класса, которые расширяют различные классы API. Два класса имеют некоторые дубликаты методы (один и тот же метод повторяется в обоих классах) и как удалить это дублирование?

Редактировать

И ApiClass, и AnotherApiClass не находятся под моим контролем

Ответы [ 5 ]

2 голосов
/ 13 марта 2010

В зависимости от кода вы можете сделать что-то вроде:

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 (и установить при необходимости). Мне не нравится этот способ, так как он делает методы get / set общедоступными, что может означать, что вы делаете вещи, которые вы не хотите быть доступными. Альтернативой было бы сделать что-то с помощью рефлексии, но я бы хотел этого еще меньше: -)

1 голос
/ 14 марта 2010

Дублирующие методы, которые полагаются на переменные-члены, также подразумевают дублирующиеся переменные-члены - и начинают пахнуть как слишком большие классы. Как бы выглядели эти конкретные переменные-члены с помощью метода (ов), если бы вы извлекли их в их собственный класс, а затем скомпоновали этот класс в другие ваши классы? Предпочитаю композицию наследованию .

1 голос
/ 13 марта 2010

Звучит как случай для "Стратегического паттерна".

class A extends ApiClass {
   private ClassContainingDupMethod strategy;
}

class N extends AnotherApiClass {
   private ClassContainingDupMethod strategy;

   public methodCallingDupMethod(){
      strategy.dupMethod();
   }
}

class ClassContainingDupMethod{
   public dupMethod(){;}
}

Или dupMethod унаследован от классов Api?

0 голосов
/ 14 марта 2010

Вам необходимо объединить классы в один объект, а затем все классы, используя два других класса, изменить их код для использования одного класса.

0 голосов
/ 13 марта 2010
class BaseApiClass
{
   public void duplicateMethod()
   {
   }
}

class ApiClass  extends BaseApiClass
{
}
class AnotherApiClass  extends BaseApiClass
{
}

class A extends ApiClass
{
}    

class B extends AnotherApiClass
{
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...