Я реализую интерфейс, который определяет метод, который может вызвать исключение, если параметры недопустимы.То, что составляет допустимые параметры, зависит от класса реализации.Интерфейс также определяет метод isValid()
, который можно использовать для проверки параметров, но возвращает логическое значение, а не генерировать исключение.Я обнаружил, что реализация обоих методов вызовет много дублирования.Рассмотрим этот выдуманный пример:
public class Something implements SomeInterface {
// Other class stuff
public void doTheThing(SomeParameter sp) throws SpecificRuntimeException {
if(sp == null) throw new ParameterCannotBeNullException();
if(sp.getNonZeroInt() == 0) throw new ShouldBeNonZeroException();
if(!sp.someOtherCondition()) throw new SomeConditionNotMetException();
...
}
public boolean isValid(SomeParameter sp) {
if(sp == null) return false;
if(sp.getNonZeroInt() == 0) return false;
if(!sp.someOtherCondition()) return false;
...
return true;
}
}
Проблема заключается в том, что проверки в обоих методах должны быть согласованными и по сути дублировать логику.Я пытался объединить проверки, чтобы оба метода использовали одинаковые проверки, но поведение все еще сохраняется.Некоторые вещи, которые я рассмотрел:
- в
doTheThing()
имеют строку if(!isValid(sp) throw new RuntimeException();
- , разделяющую часть, генерирующую исключение, в отдельный частный метод, скажем
checkParameter()
и в isValid()
do: try { checkParameter(sp); return true; } catch (SpecificRunTimeException e) { return false; }
Проблема с 1. заключается в том, что конкретное исключение потеряно, и я хочу предоставить максимально подробное исключение.Проблема с 2. использует механизм исключений кажется ... неправильно как-то.Эта часть кода может быть чувствительной к производительности, и я не хочу, чтобы зависел от чего-то, что существенно медленнее, чем должно быть (если я должен сделать это таким образом иПрофилирование не показывает проблему, достаточно справедливо ... но что, если это проблема?).Или было ли снижение производительности при использовании исключений таким способом незначительным?
Каков наилучший способ рефакторинга этого кода, чтобы использовать ту же логику проверки достоверности?