Слишком общий интерфейс - PullRequest
3 голосов
/ 17 октября 2008

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

Ответы [ 2 ]

12 голосов
/ 17 октября 2008

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

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 голосов
/ 17 октября 2008

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

Это будет особенно ужасно, если код использует ваш 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
    }
}

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

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