Suponiendo que tengo que leer de un archivo, y luego construir un objeto de Java fuera de él.
PersonData p = new PersonData();
p.setName(readTokenAsString());
p.setAge(AgeConverter.createFromDateOfBirth(readTokenAsString())); // this throws a checked exception if the date of birth is mal-formed.
//... a list of methods that throws exception as AgeConverter
Comportamiento que quiero: Si un atributo tiene un problema, simplemente lo ignoran y tener otros atributos de proceso.
Solución que se me ocurre:
try {
p.setAge1(...);
} catch (Exception e) {
//log and ignore
}
try {
p.setAge2(...);
} catch (Exception e) {
//log and ignore
}
//repeat for each attribute
Pregunta:
¿Hay una mejor manera de hacer esto para evitar la repetición? estilo funcional tal vez?
a) ¿Cuál es el mejor enfoque si no puedo modificar PersonData
la clase.
b) ¿Cuál es el mejor enfoque si puedo reescribir PersonData
clase.
Dada su declaración actual, lo haría de la siguiente manera.
Definir una @FunctionalInterface
a la que puede pasar su lógica de E / S:
@FunctionalInterface
public interface CheckedSupplier<T> {
T getValue() throws Exception;
}
Definir un método de utilidad que consume el @FunctionaInterface
:
public static final <T> T getValueWithDefault(CheckedSupplier<T> supplier, T defaultValue) {
try {
return supplier.getValue();
} catch (Exception e){
return defaultValue;
}
}
Utilice el método de utilidad como sigue:
PersonData p = new PersonData();
p.setName(getValueWithDefault(() -> readTokenAsString(), "default"));
p.setAge(getValueWithDefault(() -> AgeConverter.createFromDateOfBirth(readTokenAsString()), 0));
Esto debería hacer el truco sin tener en cuenta el tiempo que desee modificar la PersonData
clase o no.