Autor Tema: Ejemplo implementación método equals en Java. Ejercicio resuelto CU00694B.  (Leído 2673 veces)

RaGa

  • Moderador Global
  • Intermedio
  • *******
  • APR2.COM
  • Mensajes: 234
    • Ver Perfil
Mi versión del Ejercicio propuesto en la Entrega Nº94. Ejercicio CU00694B.

Citar
Define una clase Figura de la que hereden otras dos clases denominadas Cuadrado y Círculo. La clase figura debe tener al menos el campo dimensionPrincipal. Las clases Cuadrado y Círculo deben tener al menos un método calcularArea que permita calcular el área a partir de la dimensión principal, utilizando la fórmula matemática correspondiente. Además, sobreescribe el método equals para que dos cuadrados sean iguales si tienen igual dimensión principal, y dos círculos idem. A continuación crea un programa test donde crees varios círculos y cuadrados y hagas comprobaciones de igualdad usando el método equals.

Clase Figura
Código: [Seleccionar]
/**
 * Clase Figura
 *
 * @author (RaGa)
 * @version (20150428)
 */
public class Figura{
    // Declaración de campos de instancia.
    protected double dimensionPrincipal;

    /**
     * Constructor de clase
     */
    public Figura(double dimensionPrincipal){
        this.dimensionPrincipal=dimensionPrincipal;
    }

    /**
     * setters
     */
    public void setDimensionPrincipal(double dimensionPrincipal){
        this.dimensionPrincipal=dimensionPrincipal;
    }
   
    /**
     * getters
     */
    public double getDimensionPrincipal(){
        return dimensionPrincipal;
    }
   
    /**
     * método equals
     */
    public boolean equals(Object obj){
        if(obj instanceof Figura){
            Figura tmp=(Figura)obj;
            if(this.dimensionPrincipal==tmp.dimensionPrincipal){
                return true;
            }
            else{return false;}
        }
        else{return false;}
    }
   
   
} // fin de la clase

Clase Cuadrado
Código: [Seleccionar]
/**
 * Clase Cuadrado
 *
 * @author (RaGa)
 * @version (20150428)
 */
public class Cuadrado extends Figura{
    // Declaración de campos de instancia

    /**
     * Constructor de clase
     */
    public Cuadrado(int dimensionPrincipal){
        super(dimensionPrincipal);
    }

    /**
     * método calcularArea
     */
    public double calcularArea(){
        return (Math.pow(dimensionPrincipal,2));
    }
   
    /**
     * método equals
     */
   
    @Override
    public boolean equals(Object obj){
        if(obj instanceof Cuadrado){
            return super.equals(obj);
        }
        else{return false;}
    }

Clase Circulo
Código: [Seleccionar]
/**
 * Clase Circulo
 *
 * @author (RaGa)
 * @version (20150428)
 */
public class Circulo extends Figura{
    // Declaración de campos vacía

    /**
     * Constructor de clase
     */
    public Circulo(int dimensionPrincipal){
        super(dimensionPrincipal);
    }

    /**
     * método calcularArea
     */
    public double calcularArea(){
        return (Math.PI*Math.pow(dimensionPrincipal,2));
    }
   
    /**
     * método equals
     */
   
    @Override
    public boolean equals(Object obj){
        if(obj instanceof Circulo){
            return super.equals(obj);
        }
        else{return false;}
    }
       

   
} // fin de la clase

Clase TestFigura
Código: [Seleccionar]
/**
 * Clase TestFigura
 *
 * @author (RaGa)
 * @version (20150428)
 */
public class TestFigura{
    // Declaración de campos de clase vacía
 
    /**
     * Constructor de clase vacío
     */
    public TestFigura(){
    }

    /**
     * método main
     */
    public static void main(String[] args){
       
        // Creacion de los objetos
        Figura cuadrado1 = new Cuadrado(5);
        Figura cuadrado2 = new Cuadrado(8);
        Figura cuadrado3 = new Cuadrado(5);
       
        Figura circulo1 = new Circulo(7);
        Figura circulo2 = new Circulo(8);
        Figura circulo3 = new Circulo(7);
       
        // Comparación de objetos
        System.out.println("\fCOMPARACION ENTRE CUADRADOS");
        System.out.println("¿Es cuadrado1 igual a cuadrado2? "+cuadrado1.equals(cuadrado2));
        System.out.println("¿Es cuadrado1 igual a cuadrado3? "+cuadrado1.equals(cuadrado3));
        System.out.println("¿Es cuadrado2 igual a cuadrado3? "+cuadrado2.equals(cuadrado3));
        System.out.println("");
        System.out.println("COMPARACION ENTRE CÍRCULOS");
        System.out.println("¿Es circulo1 igual a circulo2? "+circulo1.equals(circulo2));
        System.out.println("¿Es circulo1 igual a circulo3? "+circulo1.equals(circulo3));
        System.out.println("¿Es circulo2 igual a circulo3? "+circulo2.equals(circulo3));
        System.out.println("");
        System.out.println("COMPARACION ENTRE UN CUADRADO Y UN CÍRCULO DE IGUAL DIMENSION PRINCIPAL");
        System.out.println("¿Es circulo2 igual a cuadrado2? "+circulo1.equals(cuadrado2));
       
    } // fin del main
       

   
} // fin de la clase

Se sobreescribió el método equals en la clase Figura, en la clase Cuadrado y en la clase Circulo.

La justificación es por motivos de modularidad y posible expansión en el futuro.

La clase Figura tiene un solo campo y es el que se compara en el método equals correspendiente a esta clase.

Si en el futuro se ampliara la cantidad de campos de la clase Figura y se  estableciera como criterio de igualdad para todos los objetos Figura (además del campo dimensión principal) que fuera necesaria la igualdad de algún otro campo, dicha comparación se incluiría en esta clase.

De esta manera, no se repetiría código en cada una de las subclases que pudiera tener la clase Figura.

A su vez, cada subtipo sobreescribe el método equals lo cual les  permite:

*) Primero establecer si lo que se están comparando son figuras del mismo tipo.
Si no estableciéramos esta comparación previa y solo usáramos el método equals de la superclase, obtendríamos un 'true' si comparamos un cuadrado y un círculo con la misma valor de campo dimension principal.

*) Cada método sobreescrito equals de cada subclase llama al método equals de la superclase para comprobar si cumple todos los requisitos de igualdad de la superclase Figura. (Hoy es un solo criterio, pero pueden ser muchos).

*) Pero además es necesario que cada subclase sobreescriba el método equals para poder establecer (en un futuro) criterios de igualdad que no son comunes a todos los objetos tipo Figura.

Por ejemplo: si en una posible ampliación de código, la clase Figura incorporara el campo 'color', y el criterio de color no fuera una condicion de igualdad para la clase Cuadrado pero sí para los objetos tipo Circulo, estableceríamos esa comparación del color en el método equals de la clase Circulo.

« Última modificación: 29 de Abril 2015, 08:34 por Alex Rodríguez »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Hola Raga como el ejercicio está perfecto no tengo nada que pueda indicar a mejorar, por eso lo que voy es a destacar las cosas que están muy bien:

La definición del método equals en la superclase y su sobreescritura en las subclases -- > muy bien, reutilización de código, modularidad, mantenibilidad...

La declaración de tipo estático el más amplio (Figura) y tipo dinámico el concreto (Cuadrado o Circulo) como por ejemplo Figura cuadrado1 = new Cuadrado(5); -- > muy bien, utilización del polimorfismo, aporta ventajas.

Uso del api de Java p.ej. Math.PI para recuperar el número pi y Math.pow -- > muy bien, uso de herramientas disponibles.

Los comentarios que has hecho -- > completamente acertados.

Poco más que añadir ;)

Saludos

RaGa

  • Moderador Global
  • Intermedio
  • *******
  • APR2.COM
  • Mensajes: 234
    • Ver Perfil
Muchas gracias Alex!... Seguimos adelante!  :D

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".