例外のあるインターフェイスは、例外なしでインターフェイスを拡張します
ヘイ、
ユーザー名として機能する一意のフィールド email を持つ User-Table があります。同じ情報で dao.create メソッドを 2 回呼び出すと、org.springframework.dao.DataIntegrityViolationException (Duplicate entry....) が発生します。これにより、userDao.create(o) でチェック済み例外をスローする必要があるポイントに到達します。今、私は UserDao-Interface が GenericDao-Interface を拡張するという問題を抱えています。これは、throw-clause なしで create メソッドを既に定義しています。
拡張するインターフェイスは、拡張しているインターフェイスよりも多くの例外をスローできないため、このコードはコンパイルされません。
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: これまでのところ、私はいくつかの答えを思いつきましたが、それらは私を本当に満足させるものではありません. 1 つには、GenericDao にチェック例外をスローさせることができますが、テーブルの約 99% には (pk 以外の) 一意のフィールドがないため、これは受け入れられません。UserExistsException を Runtime-Exception にして文書化するのは、メソッドのユーザーに強制的に例外をキャッチさせてエンドユーザーに報告させたいため、あまりうまくいきません。Exeption をスローする新しい userDao.createUser() メソッドを作成し、既存の userDao.create() メソッドで UnsupportedOperationException をスローすることは、これまでに頭に浮かんだすべてのソリューションの中で最も整然としたものであることがわかりました。私はまだ知りたいのですが、この問題を解決する適切な方法は何ですか?