Publicado en Tema 5 • Programación Orientada a Objetos

Ejercicio 11: Sobrescritura de métodos (toString y equals)

Enunciado

Crea una clase Libro con los siguientes atributos:

  • titulo (String)
  • autor (String)
  • isbn (String)
  • anioPublicacion (int)

Tareas a realizar:

  1. Implementar el constructor de la clase que inicialice todos los atributos.
  2. Sobrescribir el método toString() para que devuelva la representación: "Título: [titulo], Autor: [autor], ISBN: [isbn], Año: [anioPublicacion]".
  3. Sobrescribir el método equals() para que dos libros se consideren iguales si tienen el mismo ISBN.
  4. En el main(), crear varios objetos Libro, imprimirlos y verificar el funcionamiento del método equals().
---

Solución Propuesta

Para este ejercicio es fundamental entender que el método equals() por defecto compara referencias de memoria. Al sobrescribirlo, permitimos que la lógica de nuestra aplicación decida cuándo dos objetos son "lógicamente iguales" (en este caso, por su ISBN).

1. Clase Libro

package Tema5.Ejercicios.ejercicio11;

import java.util.Objects;

public class Libro {
    private String titulo;
    private String autor;
    private String isbn;
    private int anioPublicacion;

    // Constructor
    public Libro(String titulo, String autor, String isbn, int anioPublicacion) {
        this.titulo = titulo;
        this.autor = autor;
        this.isbn = isbn;
        this.anioPublicacion = anioPublicacion;
    }

    // Sobrescribir el método toString()
    @Override
    public String toString() {
        return "Título: " + titulo + ", Autor: " + autor + ", ISBN: " + isbn + ", Año de publicación: " + anioPublicacion;
    }

    // Sobrescribir el método equals() para comparar por ISBN
    @Override
    public boolean equals(Object obj) {
        // Comprobar si es exactamente el mismo objeto en memoria
        if (this == obj) {
            return true;
        }
        // Comprobar si el objeto pasado es nulo o si no es de la clase Libro
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        // Hacer el casting a Libro y comparar los ISBN
        Libro libro = (Libro) obj;
        return Objects.equals(this.isbn, libro.isbn);
    }
}

2. Clase Principal (Main)

En el programa principal probamos cómo la sobrescritura afecta al comportamiento de nuestras impresiones y comparaciones.

package Tema5.Ejercicios.ejercicio11;

public class Main {
    public static void main(String[] args) {
        // Creamos tres objetos Libro. Dos de ellos tendrán el mismo ISBN para probar el equals()
        Libro libro1 = new Libro("El Quijote", "Miguel de Cervantes", "111-222-333", 1605);
        Libro libro2 = new Libro("1984", "George Orwell", "999-888-777", 1949);
        Libro libro3 = new Libro("El Quijote (Edición Especial)", "Miguel de Cervantes", "111-222-333", 2015);

        // Imprime cada libro (esto usa automáticamente el método toString sobrescrito)
        System.out.println("--- Lista de Libros ---");
        System.out.println(libro1);
        System.out.println(libro2);
        System.out.println(libro3);
        System.out.println();

        // Compara libros usando equals()
        System.out.println("--- Comparaciones ---");

        // Compara dos libros con el MISMO ISBN (debe devolver true)
        System.out.println("¿Libro 1 y Libro 3 son iguales? (Mismo ISBN): " + libro1.equals(libro3));

        // Compara dos libros con DISTINTO ISBN (debe devolver false)
        System.out.println("¿Libro 1 y Libro 2 son iguales? (Distinto ISBN): " + libro1.equals(libro2));
    }
}
Nota: Al sobrescribir equals(), es una buena práctica sobrescribir también hashCode() para mantener la consistencia si planeas usar estos objetos en colecciones como HashSet o HashMap.