Herramientas de usuario

Herramientas del sitio


bloque3:comparable

Herencia: Interface Comparable

Cuando una clase implementa una interface, obliga a sobrescribir los métodos de esa interface. En Java tenemos muchas interfaces para hacer que nuestras clases tengan una forma común. La interfaz Comparable nos servirá para poder ordenar colecciones de objetos de tipo List<> (Arrays, ArrayLists, LinkedLists, etc.)

Interface Comparable

La interface Comparable se usa para obligar a las clases que la implementan a definir sus métodos, de cara a poder ser ordenados. Esta interface solo tiene un método: compareTo(), el cual hemos usado en ocasiones anteriores en objetos de otras clases.

https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html

Cuando una clase implementa la interface Comparable, es posible ordenar mediante los métodos de las clases de Java, Arrays o colecciones de tipo list, por poner ejemplos.

  • Arrays.sort(): recibe un Array y lo ordena.
  • Collections.sort(): recibe un elemento de tipo List<> y lo ordena (ArrayList, LinkedList, Stack, etc).

Método compareTo()

El método compareTo() se usa para saber si un objeto tiene un orden natural mayor o menor que el objeto actual (desde el que se llama al método):

  • Devuelve 0 en caso de que ambos objetos tengan el mismo orden (no haya uno mayor que otro)
  • Un número entero negativo si el objeto actual es menor al objeto pasado como parámetro
  • Un número positivo si el objeto actual es mayor al objeto pasado como parámetro

La interfaz Comparable es implementada por una clase según la siguiente definición:

public class Coche implements Comparable<Coche>{public int compareTo(Coche o){}
}

Así indicamos que vamos a implementar la interface Comparable en la clase Coche, para el parámetro de tipo Coche.

Criterios de órden

A continuación, debemos plantearnos qué criterios seguiremos para indicar que un Coche sea mayor que otro dentro de un orden natural. Este criterio atenderá al valor de alguno de sus atributos.

Por ejemplo, podemos definir que un coche con un LocalDate fechaMatriculación mayor que otro, es un coche mayor. O que un coche con un String matrícula menor que otra será un objeto menor, o el nº de km, etc.

Una vez tengamos seleccionado el atributo/s que indicará quien es mayor, debemos implementar el método compareTo() a partir de la comparación de esos atributos. Si el atributo es una referencia a un objeto, podemos usar el método compareTo() de esa clase de objetos, si lo tienen implementado. En el caso de los Strings, ya tienen implementado la interface Comparable, y tienen su propio método compareTo(). Esto mismo ocurrirá con distintos objetos de clases de la API de Java. Si queremos que nuestros objetos sean ordenables deben implementar esta interface.

Ejemplos de implementación del método compareTo():

//Atendiendo a su numero de km int
public int compareTo(Coche otro){
	return this.km – otro.km;	//Resto los km y tendré 0, >0 ó <0
}
//Atendiendo a su fecha de matriculación LocalDate
public int compareTo(Coche otro){
	return fechaMatriculacion.compareTo(otro.fechaMatriculacion);
	// Devuelvo lo que devuelve el método compareTo() de LocalDate
}
//Atendiendo a su matricula String
public int compareTo(Coche otro){
	return matricula.compareTo(otro.matricula);
	// Devuelvo lo que devuelve el método compareTo() de String
}

Reglas de implementación

Además, tal y como se comenta en la API sobre la interface Comparable se debe atender a una serie de reglas:

  • compareTo() debe ser reciproco. Se debe cumplir: a.compareTo(b) == - b.compareTo(a) .
  • Si el método equals() de la clase que implementa la interface devuelve true, compareTo() debe devolver 0.
  • Si el objeto que se recibe por parámetro es null debe lanzar una excepción de tipo NullPointerException. Esto ocurre sin hacer nada, en el momento que accedamos a algún campo del objeto null.
  • Si el objeto que se recibe como parámetro no permite ser comparado debe lanzar una excepción de tipo ClassCastException (No existe un criterio común; no es de la misma clase)

© 2020 Fernando Valdeón

bloque3/comparable.txt · Última modificación: 04/04/2019 14:50 por Fernando Valdeón