Я думаю, что проблема может заключаться в том, что исключение выдается кодом, который получает аргументы для передачи сеттерам. Таким образом, одним из возможных подходов было бы сделать эту часть кода ленивой с помощью Supplier
, а затем вызвать .get()
для Supplier
внутри блока try/catch
(а также вызвать Consumer
):
private static <T> void setOptionalParameter(
Supplier<? extends T> supplier,
Consumer<? super T> consumer) {
try {
consumer.accept(supplier.get());
} catch (IllegalArgumentException ignored) {
}
}
Вы можете вызвать этот метод следующим образом:
setOptionalParameter(() -> ...some operation with source..., product::setProductType);
Обратите внимание, что я улучшил сигнатуру вашего метода, так что теперь он принимает более широкий диапазон общих подтипов и супертипов для Supplier
и Consumer
соответственно.
РЕДАКТИРОВАТЬ: Согласно комментариям, описанный выше подход может быть недостаточно гибким, т. Е. Если метод принимает более одного аргумента и т. Д. В этом случае было бы лучше использовать Runnable
экземпляр:
private static void setOptionalParameter(Runnable action) {
try {
action.run();
} catch (IllegalArgumentException ignored) {
}
}
И вызов теперь стал бы:
setOptionalParameter(() -> {
ProductType productType = ...some operation with source...;
Material material = ...some operation with source...;
product.doSomethingWith2Args(productType, material);
});