2008-10-16 6 views
3

В коде Java, с которым я работаю, у нас есть интерфейс для определения наших объектов доступа к данным (DAO). Большинство методов принимают параметр объекта передачи данных (DTO). Проблема возникает, когда реализация DAO должна ссылаться на определенный тип DTO. Затем этот метод должен выполнить (для меня совершенно ненужный отбор DTO для SpecificDTO. Не только это, но и компилятор не может применять какой-либо тип проверки типов для конкретных реализаций DAO, которые должны принимать только в качестве параметров их специфические типы . DTOS Мой вопрос: как я могу исправить это в наименьшей возможной формеИнтерфейс слишком общий

ответ

12

Вы могли бы использовать дженерики:

DAO<SpecificDTO> dao = new SpecificDAO(); 
dao.save(new SpecificDTO()); 
etc. 

Ваш класс DAO будет выглядеть следующим образом:

interface DAO<T extends DTO> { 
    void save(T); 
} 

class SpecificDAO implements DAO<SpecificDTO> { 
    void save(SpecificDTO) { 
     // implementation. 
    } 
    // etc. 
} 

SpecificDTO бы расширять или им DTO.

+0

Спасибо. Сначала я не мог это увидеть, но после нескольких аргументов с компилятором все стало ясно. – 2008-10-17 16:11:38

0

Рефакторинг для дженериков - это небольшое количество боли (хотя это, скорее всего, стоит того).

Это будет особенно ужасающим, если код использует свой интерфейс DTO как так:

DTO user = userDAO.getById(45); 

((UserDTO)user).setEmail(newEmail) 

userDAO.update(user); 

Я видел это сделано (в гораздо более тонкими способами).

Вы можете сделать это:

public DeprecatedDAO implements DAO 
{ 
    public void save(DTO dto) 
    { 
     logger.warn("Use type-specific calls from now on", new Exception()); 
    } 
} 

public UserDAO extends DeprecatedDAO 
{ 
    @Deprecated 
    public void save(DTO dto) 
    { 
     super.save(dto); 
     save((UserDTO)dto); 
    } 

    public void save(UserDTO dto) 
    { 
     // do whatever you do to save the object 
    } 
} 

Это не большого решения, но может быть проще реализовать; ваш старый код должен по-прежнему работать, но он будет генерировать предупреждения и трассировки стека, чтобы помочь вам их выследить, и вы также реализуете тип безопасности.

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