Учитывая ваше текущее объявление, я бы сделал это следующим образом.
Определите @FunctionalInterface
, которому вы можете передать свою логику ввода / вывода:
@FunctionalInterface
public interface CheckedSupplier<T> {
T getValue() throws Exception;
}
Определите служебный метод, который потребляет @FunctionaInterface
:
public static final <T> T getValueWithDefault(CheckedSupplier<T> supplier, T defaultValue) {
try {
return supplier.getValue();
} catch (Exception e){
return defaultValue;
}
}
Используйте служебный метод следующим образом:
PersonData p = new PersonData();
p.setName(getValueWithDefault(() -> readTokenAsString(), "default"));
p.setAge(getValueWithDefault(() -> AgeConverter.createFromDateOfBirth(readTokenAsString()), 0));
Это должно сработать независимо от того, хотите вы изменить класс PersonData
или нет.