В коде Java, с которым я работаю, у нас есть интерфейс для определения наших объектов доступа к данным (DAO). Большинство методов принимают параметр объекта передачи данных (DTO). Проблема возникает, когда реализация DAO должна ссылаться на определенный тип DTO. Затем этот метод должен выполнить (для меня совершенно ненужный отбор DTO для SpecificDTO. Не только это, но и компилятор не может применять какой-либо тип проверки типов для конкретных реализаций DAO, которые должны принимать только в качестве параметров их специфические типы . DTOS Мой вопрос: как я могу исправить это в наименьшей возможной формеИнтерфейс слишком общий
3
A
ответ
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
Рефакторинг для дженериков - это небольшое количество боли (хотя это, скорее всего, стоит того).
Это будет особенно ужасающим, если код использует свой интерфейс 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
}
}
Это не большого решения, но может быть проще реализовать; ваш старый код должен по-прежнему работать, но он будет генерировать предупреждения и трассировки стека, чтобы помочь вам их выследить, и вы также реализуете тип безопасности.
Смежные вопросы
- 1. Общий интерфейс
- 2. Общий интерфейс
- 3. Общий интерфейс VS общий метод?
- 4. Реализация общий интерфейс, который принимает общий интерфейс в качестве параметра
- 5. Реализовать общий интерфейс C++/CLI в C# общий интерфейс
- 6. Регулярное выражение слишком общий
- 7. Общий интерфейс отсутствует реализация
- 8. Общий интерфейс Java AMQP
- 9. Общий интерфейс Java
- 10. Общий интерфейс принтеров
- 11. Общий интерфейс - Java
- 12. Общий интерфейс и ReaderWriterLockSlim
- 13. Общий интерфейс типов ввода
- 14. JSON распаковать общий интерфейс {}
- 15. Общий интерфейс mess
- 16. Вызов общий интерфейс
- 17. C++ Сделать общий интерфейс
- 18. нагнетание общий интерфейс
- 19. C# Общий интерфейс
- 20. Общий интерфейс для функции
- 21. Реализовать общий интерфейс
- 22. Статическая реализация общий интерфейс
- 23. Общий API-интерфейс API
- 24. Общий интерфейс со свойством
- 25. Общий интерфейс ограничение
- 26. Бетон Тип/Общий интерфейс
- 27. реализовать общий общий интерфейс в Скале
- 28. Как передать общий параметр в общий интерфейс?
- 29. Java-общий вывод слишком широк?
- 30. Разрешающая Общий интерфейс с Autofac
Спасибо. Сначала я не мог это увидеть, но после нескольких аргументов с компилятором все стало ясно. – 2008-10-17 16:11:38