2016-05-25 2 views
0

В настоящее время я пишу XML-конвертер для проекта цепочки поставок. Мы используем Запросы и Заказы.Использование Метод общего типа

Конвертер имеет несколько методов, которые в настоящее время выполняют одно и то же, но отдельно реализуют запросы и заказы.

Поэтому я создал абстрактный класс для улучшения ремонтопригодности кода и используется общий тип:

public abstract class AbstractConverter<T extends BusinessObject> 

Тогда у меня есть конкретные реализации для реальных преобразователей

public class OrderConverter extends AbstractConverter<Order> 
public class RequestConverter extends AbstractConverter<Request> 

Как я уже сказал , У меня есть несколько методов в двух конкретных классах, которые в основном делают то же самое, поэтому я, естественно, хочу их в абстрактном классе. Теперь я добавил следующий метод для абстрактного класса:

protected Comment createComment(T obj) { 
    String remark; 
    if (obj instanceof Order) { 
     remark = ((Order) obj).getRemark(); 
    } else if (obj instanceof Request) { 
     remark = ((Request) obj).getRequestRemark(); 
    } else { 
     throw new IllegalArgumentException("This method does not support objects of the type " + obj.getClass().toString()); 
    } 
    return new Comment(remark); 
} 

Мой вопрос теперь: это путь, или есть более элегантный способ использовать дженерики в этом контексте?

Мне нужно это решение, но я также хочу использовать хороший стиль.

+0

Что означает "в основном" означает? Нет «немного беременной». Они одинаковы, затем втягивают их в абстрактный класс или их нет, а затем реализуют отдельно (см. Ответ wero). Повышенная сложность и недостижимость, введя if/else/instanceof blocks - это ИМХО, действительно плохая идея. – Fildor

ответ

3

Природная объектно-ориентированное решение сделать createComment абстрактный метод

protected abstract Comment createComment(T obj); 

и пусть подклассы реализовать:

public class OrderConverter extends AbstractConverter<Order> { 
    protected Comment createComment(Order order) { 
      return new Comment(order.getRemark()); 
    } 
} 

public class RequestConverter extends AbstractConverter<Request> { 
    protected Comment createComment(Request request) { 
      return new Comment(request.getRequestRemark()); 
    } 
} 
2

Я предлагаю извлечь метод getRemark интерфейсу, который реализует как Request, так и Order.

Таким образом, вы можете просто проверить, является ли входящий общий объект экземпляром интерфейса.

protected Comment createComment(T obj) { 
    if (obj instanceof Remarkable) { 
     return new Comment(((Remarkable) obj).getRemark()); 
    } 
    throw new IllegalArgumentException("This method does not support objects of the type " + obj.getClass().toString()); 
} 
+1

... и вы даже можете пропустить этот 'instanceof', если возможно, что« BusinessObject »также реализует этот интерфейс« Замечательный ». –

+3

@DaDaDom, тогда нет смысла иметь интерфейс. Если все «BusinessObject» могут возвращать замечания, просто используйте абстрактный метод в этом классе. –

+0

Спасибо за этот ввод. К сожалению, я не могу этого сделать, так как я не могу изменить классы Order и Request, поскольку это будет означать очень большой рефакторинг существующего кода. –