Java Efetivo Essencial - Comparable
Tags: java, backend, programming
Published: 2022-09-18 19:47:16

## Pense na possibilidade de implementar o Comparable

_Esta é uma série baseada no entendimento de tópicos relacionados ao livro com foco no resumo._

**O que é**

 No Java quando desejamos fazer comparações entre classes de valor, fazemos com que essas classes implementem a interface Comparable ou Comparator.
Neste post vamos analisar mais sobre a interface Comparable que é abordada no livro Java Efetivo e que possui apenas um único método, o compareTo().

**Comparable**

Quando uma classe implementa essa Interface esta assumindo que há ordenação natural entre objetos da classe. 
Além disso você permite que sua classe funcione com todos os algoritmos genéricos e com as implementações de coleções que dependem dessa interface como a TreeSet e TreeMap.
Se olharmos para as classes já existentes da plataforma Java, todas acabam implementando essa interface, além de que os Enums também por default implementam essa interface.

**Como?** 

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ad7xcg1mfwivr6whe5bc.png)

1-> Implementamos a interface Comparable
2-> Implementamos o Método compareTo()
3-> No método estou comparando o atributo nome que é uma String que já implementa também o método compareTo().
É importante termos em mente que para implementarmos esse método precisamos seguir um contrato geral.

**Comparações**

O contrato geral segue os seguintes itens:
1- Temos que garantir que na comparação onde temos dois objetos de comparação que se A<B então B>A e se B>A, então A<B.
2- Temos que garantir que se B>A e A>C então B>C
3- Se possível garantir que o resultado de comparação no compareTo seja semelhante o do equals.
4- Se o tipo comparado não for igual deve retornar ClassCastException
5- Se o tipo for nulo deve retornar NullPointerException.

Não é recomendado mais utilização de comparadores de valor < e > , existem métodos fluídos na implementação de Comparators após a versão 8 do Java.
Se um campo do objeto não implementar Comparable será necessário criar um Comparator desse tipo.
Se você deseja comparar múltiplos valores, a ordem a qual é comparada importa, sendo necessário sempre começarmos com os campos mais significativos.Sendo que se a comparação resultar em algo diferente de zero já pode retornar, se não continue comparando os próximos campos.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ncw8tjij8eur51lsrggf.png)
Acima vemos a aplicação da regra sobre comparação de múltiplos campos.


Em alguns casos podemos utilizar a criação de Comparators, no exemplo acima utilizamos como uma constante estática, utilizando os recursos que foram adicionados no Java 8, facilitamos muito o uso de comparações que envolvem múltiplos campos.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/44uz4r2nqonigbh4c3fn.png)

**Resumindo**
O livro aborda que quando é implementada uma classe de valor que exista uma ordenação para as instâncias que sejam implementadas a interface Comparable.
Procure usar sempre os métodos estáticos compare() que existem nos tipos primitivos empacotados ou use comparadores através da interface Comparator.