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:
- Implementar el constructor de la clase que inicialice todos los atributos.
- Sobrescribir el método
toString()para que devuelva la representación: "Título: [titulo], Autor: [autor], ISBN: [isbn], Año: [anioPublicacion]". - Sobrescribir el método
equals()para que dos libros se consideren iguales si tienen el mismo ISBN. - En el
main(), crear varios objetos Libro, imprimirlos y verificar el funcionamiento del métodoequals().
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 sobrescribirequals(), es una buena práctica sobrescribir tambiénhashCode()para mantener la consistencia si planeas usar estos objetos en colecciones como HashSet o HashMap.