DEV Community

Paula Santana
Paula Santana

Posted on

Java Efetivo Essencial - Comparable

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

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 AA e se B>A, então A 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
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

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.

Top comments (0)