Интерфейс с исключением расширяет интерфейс без исключения

Интерфейс с исключением расширяет интерфейс без исключения

сено,

У меня есть таблица пользователей с уникальным полем электронной почты, которое служит именем пользователя. Теперь, когда я дважды вызываю метод dao.create с одной и той же информацией, я получаю исключение org.springframework.dao.DataIntegrityViolationException (повторяющаяся запись....). Это подводит меня к моменту, когда я хочу, чтобы мой userDao.create(o) выдавал проверенное исключение. Теперь у меня проблема, что мой UserDao-Interface расширяет GenericDao-Interface, который уже определяет метод создания без предложения throw.

Поскольку расширяемый интерфейс не может генерировать больше исключений, чем интерфейс, который он расширяет, этот код не компилируется:

public interface GenericDao<T, PK extends Serializable> {
    /...
    T create(T object);
    /...
}

public interface UserDao extends GenericDao<User, Long> {
        /...
    User create(User user) throws UserExistsException;
    /...
}

(Почему это является причиной, см.: интерфейс Java расширяет вопросы (ответ от cletus))

Теперь мой вопрос: как лучше всего решить эту проблему?

Заранее большое спасибо за ответы =)


PS: Пока я придумал пару ответов, которые меня не очень удовлетворяют. Во-первых, я мог бы позволить GenericDao генерировать проверенное исключение, но поскольку примерно 99% таблиц не имеют уникального поля (кроме pk), это неприемлемо. Превращение UserExistsException в Runtime-Exception и его документирование тоже не очень приятно, так как я хочу заставить пользователя метода поймать исключение и сообщить о нем конечному пользователю. Создание нового метода userDao.createUser(), который выдает Exeption и выдает UnsupportedOperationException с уже существующим методом userDao.create(), кажется мне самым аккуратным из всех решений, которые пришли мне на ум до сих пор. Я все еще хотел бы знать, как правильно решить эту проблему?


person TomKeller    schedule 04.05.2012    source источник
comment
почему вы ищете метод с таким же именем в UserDAO?   -  person TKV    schedule 04.05.2012
comment
Лично я бы определенно не стал заставлять метод интерфейса объявлять какие-либо исключения. Превратите ли вы его в RuntimeException или заставите вызывающую сторону поймать и обработать, это полностью зависит от семантики бизнес-логики этого исключения.   -  person Marko Topolnik    schedule 04.05.2012
comment
Преобразование поведения набора Set #add например, это может быть boolean create(T object) и возвращать true, если создано успешно, и false, если пользователь уже существует.   -  person assylias    schedule 04.05.2012
comment
@Tijo K Varghese Я новичок в Java, и изначально я хотел создать проверенное исключение с помощью метода создания UserDao, но не с помощью метода создания GenericDao. Из-за этого я попытался переопределить метод.   -  person TomKeller    schedule 04.05.2012
comment
@Marko Topolnik Спасибо за понимание. Я решил, по крайней мере, пока не услышу лучшего решения, предоставить метод validateUserForCreation() и позволить userDao.create генерировать RuntimeExceptions.   -  person TomKeller    schedule 04.05.2012
comment
заставить вызывающую функцию сделать ее перехватываемой   -  person TKV    schedule 04.05.2012


Ответы (1)


Я предлагаю:

public interface GenericDao<T, PK extends Serializable> {
    /...
    T create(T object) throws DaoException;
    /...
}

DaoException — это (возможно, абстрактный) класс, а UserExistsException расширяет DaoException.

person Pablo    schedule 04.05.2012
comment
Спасибо за ваше предложение. Лично мне такой подход не очень нравится, поскольку он заставляет людей, использующих реализации метода создания GenericDao, перехватывать исключение, даже если реализация его не выдает. Но все равно: Спасибо =) - person TomKeller; 04.05.2012
comment
@TomKeller Это правда, что это заставляет их перехватывать исключение, поэтому это зависит от того, какие реализации вы ожидаете запрограммировать. Ожидаете ли вы реализовать что-либо, что не может генерировать исключения при создании нового DAO? По моему опыту, обычно это не так. - person Pablo; 04.05.2012