1
resposta

Comparator por meio de Lambda e implementar Comparable em Funcionario

Boa tarde!

Fiz um teste inicializando um Comparator no main por meio de um lambda, conforme código abaixo:

package br.com.alura.teste;

import java.util.Arrays;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;

import br.com.alura.modelo.Funcionario;

public class Teste {

    public static void main(String[] args) {
        Funcionario f1 = new Funcionario("Barney", 12);
        Funcionario f2 = new Funcionario("Jonatan", 9);
        Funcionario f3 = new Funcionario("Guaraciara", 13);

        Set<Funcionario> funcionarios = new TreeSet<>((Funcionario func1, Funcionario func2) -> Integer.compare(func1.getIdade(), func2.getIdade()));
        funcionarios.addAll(Arrays.asList(f1, f2, f3));

        Iterator<Funcionario> iterador = funcionarios.iterator();

        while (iterador.hasNext()) {
            System.out.println(iterador.next().getNome());
        }
    }
}

O código compila e executa normalmente, mas gostaria de saber se há alguma má prática na implementação que eu fiz.

Além disso, caso não quisesse usar um Comparator, haveria algum problema em implementar a interface Comparable em Funcionario e criar uma ordem natural baseada nas idades?

Obrigado!

1 resposta

Olá Kaue, tudo bem? Bem como você mesmo falou o código compila e executa corretamente, porém não é uma boa prática isso, pense que estamos deixando essa classe muito acoplada e também não estamos usando o principio da responsabilidade única (Single-responsibility principle), essa classe main está com muitas responsabilidades, e por tanto se torna difícil de evoluir a mesma, pense que você precise usar essa comparação em outras classes da aplicação ou mesmo em outras classes main, dessa forma você vai precisa reescrever essa lambda sempre em qualquer lugar que for preciso, mas e se a comparação mudar por algum motivo? Vai precisar alterar em todos os lugares não é? Mas e se esquecer em algum lugar? Isso pode quebrar uma parte da aplicação ou trazer resultados não coerentes, então seria ideal isolarmos esse código em uma classe como está no exercício, assim se precisarmos mudar vamos mudar em um único lugar e tudo vai continuar funcionando normalmente e não vamos ter problemas com manutenção de código.

Espero ter esclarecido sua dúvida!