mejor manera de continuar después de excepciones en Java

Weishi Zeng:

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 PersonDatala clase.
b) ¿Cuál es el mejor enfoque si puedo reescribir PersonDataclase.

user10367961:

Dada su declaración actual, lo haría de la siguiente manera.

Definir una @FunctionalInterfacea 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 PersonDataclase o no.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=208048&siteId=1
Recomendado
Clasificación