2010-03-13 4 views
1
class A extends ApiClass 
{ 
    public void duplicateMethod() 
    { 
    } 
}  


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

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

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

Оба ApiClass и AnotherApiClass не под моим контролем

+0

Если AnotherApiClass находится под вашим контролем, можете ли вы унаследовать его от ApiClass? – BeWarned

+0

Являются ли переменными-членами, от которых зависят ваши методы, в классах API или в ваших собственных классах или в обоих? –

+0

@Carl Manaster переменные в моем классе. –

ответ

1

Звучит как случай для «Стратегического узора».

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
class BaseApiClass 
{ 
    public void duplicateMethod() 
    { 
    } 
} 

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

class A extends ApiClass 
{ 
}  

class B extends AnotherApiClass 
{ 
} 
1

В зависимости от того, какой код вы могли бы сделать что-то вроде:

public class Util 
{ 
    public static void duplicateMethod() 
    { 
     // code goes here 
    } 
} 

, а затем просто другой два метода duplicateMethods называют это. Таким образом, код не будет дублироваться, но имя метода и вызов метода Util.duplicateMethod будут.

Если код в Util.duplicateMethod необходим для доступа к переменным класса или класса класса A и B, это не получится так хорошо, но это потенциально возможно (сообщите мне, если вам это нужно).

EDIT (на основе комментариев):

С переменными экземпляра становится менее довольно ... но может быть сделано. Что-то вроде:

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

+0

Да, метод должен получить доступ к переменным экземпляра –

1

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

0

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

Смежные вопросы