1
respuesta

[Duda] Excepciones en los constructores

En este ejemplo puntual:

public DataEpisode(Integer numberSeason, Episode e) {
        this.numberSeason = numberSeason;
        this.title = e.title();
        this.numberEpisode = e.numberEpisode();
        try {
            this.evaluation = Double.valueOf(e.imdbRating());
        } catch (NumberFormatException ex) {
            this.evaluation = 0.0;
        }
        try {
            this.released = LocalDate.parse(e.released());
        } catch (DateTimeException ex) {
            this.released = null;
        }
    }

Cual seria la mejor opción de manejar las excepciones por fuera del constructor dado a que se esta rompiendo la regla de que los constructores solo cumplan su funcion de solo inicializar objetos?

1 respuesta

¡Hola Estudiante, espero que estés bien!

En el ejemplo proporcionado, la inicialización de los atributos evaluation y released dentro del constructor de la clase DataEpisode viola la regla de que los constructores solo deben encargarse de la inicialización de objetos. Para un manejo adecuado de excepciones fuera del constructor, se proponen las siguientes alternativas:

Métodos Separados para Inicializar Atributos:

Crear métodos separados para inicializar cada atributo propenso a generar excepciones, como setEvaluation y setReleased.

public DataEpisode(Integer numberSeason, Episode e) {
    this.numberSeason = numberSeason;
    this.title = e.title();
    this.numberEpisode = e.numberEpisode();
}

public void setEvaluation(String imdbRating) {
    try {
        this.evaluation = Double.valueOf(imdbRating);
    } catch (NumberFormatException ex) {
        this.evaluation = 0.0;
    }
}

public void setReleased(String releasedDate) {
    try {
        this.released = LocalDate.parse(releasedDate);
    } catch (DateTimeException ex) {
        this.released = null;
    }
}

Validación y Manejo de Excepciones en el Método de Uso:

Validar los valores de entrada antes de pasarlos al constructor, y manejar las excepciones en el método donde se utiliza la clase DataEpisode.

public class Main {

    public static void main(String[] args) {
        Episode e = new Episode();
        e.setTitle("Episodio 1");
        e.setNumberEpisode(1);
        e.setImdbRating("8.5");
        e.setReleased("2024-05-03");

        DataEpisode dataEpisode;
        try {
            dataEpisode = new DataEpisode(1, e);
        } catch (NumberFormatException | DateTimeException ex) {
            System.err.println("Error al crear DataEpisode: " + ex.getMessage());
            dataEpisode = new DataEpisode(1, e); // Asignar valores predeterminados
        }

        System.out.println("DataEpisode: " + dataEpisode);
    }
}

Consideraciones:

  • La elección del método depende del contexto y las necesidades específicas del proyecto.
  • La validación de entrada es crucial para prevenir errores y mejorar la robustez del código.

Espero que esta sugerencia te sea de ayuda para manejar las excepciones de manera más adecuada. ¡Si tienes alguna otra duda, estaré encantada de ayudarte! ¡Buenos estudios!