非常に巨大なプロジェクトでは、例外の詳細がenum
として実装されているExceptionClassesがたくさんあります。一般Javaコードで一意でないIDを確認する方法
NAME_OF_EXCEPTION_DETAIL(ID, PRIORITY)
例えば:
NO_LICENSE_FOUND(100, 0)
UNSUPPORTED_LICENSE(101, 1)
WRONG_LICENSE_FOR_VERSION(101, 0)
いくつかのケースでは、例外の詳細IDが同じで、ウィッヒが起こったことがないはずです。可能であれば重複している可能性がありますが、このプロジェクトは手作業でこれをチェックするために膨大なものになります...
重複のコードをチェックするスマートな方法はありますか? UnitTesting - それを使用したことはありません。
ありがとうございました!
編集(ベンズの答えは一つだけ列挙型を使用する場合にこの問題を解決するための良い方法です): これは状況です私の特定のタスクに、より明確にします。 ExceptionDetailsを処理するために作成されたクラスがたくさんあります。
TopicOneExceptionDetails.java
TopicTwoExceptionDetails.java (and so on)
これらのクラスのそれぞれのでように、このトピックの列挙をdefindes:
例えばTopicOneエラーに関連するエラーの宣言が続くpublic enum TopicOneExceptionDetails implements ApplicationException.ExceptionDetails { .... }
SETTING_TIMEZONE_FAILED(55, ...)
Setting_DATETIME_FAILED(56, ...)
この列挙体のTopicOneでは、すべてのエラーIDは一意でなければなりません。しかし、たとえばID 55(ここではSETTING_TIMEZONE_FAILEDに使用されています)は、TopicTwoに関連するエラーの宣言に問題なく使用できます。
編集2(反射を使用しますか?) 私はMatt Sheppardによって書かれたJava Reflections
についてpretty informative answerを見つけました。私はこれが私の問題を解決できると思います。私は休憩を取る必要がありますが、私は戻って報告します。私の現在の考えは次のとおりです:
Reflections reflections = new Reflections("project.de")
for(Class<? extends ApplicationException.ExceptionDetails> exceptionDetailsClasses : reflections.getSubTypesOf(ApplicationException.ExceptionDetails.class)){
for (...) .. }
私はIDを確認することができます。ベンがアドバイスしたように。私は後でまた報告します。 EDIT 3(質問解決!) などは編集2に、私は簡単にreflections
を使用してこの問題を解決することができました説明
。ベンへ
public class ApplicationExceptionDetailsErrorCodeValidationTest {
@Test
public void validateErrorCodeUniqueness() throws ErrorCodeUniquenessBroken{
Reflections reflections = new Reflections("de.xyz");
for (Class<? extends ApplicationException.ExceptionDetails> exceptionDetailsClass : reflections.getSubTypesOf(ApplicationException.ExceptionDetails.class)) {
if (exceptionDetailsClass.getSimpleName().equals("TestExceptionDetails")) {
continue;
}
List<Integer> errorCodes = new ArrayList<Integer>();
for (ApplicationException.ExceptionDetails exceptionDetails : exceptionDetailsClass.getEnumConstants()) {
if (errorCodes.contains(exceptionDetails.getErrorCode().getId())) throw new ErrorCodeUniquenessBroken("ErrorCode uniqueness broken! ErrorCode: " + exceptionDetails.getMessageKey() + " has repeated ErrorCode! Change it!");
else errorCodes.add(exceptionDetails.getErrorCode().getId());
}
}
}}
感謝し、彼らの努力のために見つけました。両方とも、トピックの問題を一般的に解決するには、かなり良い例がいくつかありました。私の場合はちょっと複雑になりました。
静的テーブル。 – Henry
おもしろい、ありがとう。どのように見えるのでしょうか? – Chrizzldi
exptionclassesには例外があります。静的なテーブルと比較すると、複数の静的テーブルが生成されますか?私はこれについて考えるなら、私はすべてのexpectiondetailsコールでこのチェックを実装する必要があると確信しています - そうですか? – Chrizzldi