3
respostas

Duvida!!

Ola boa noite a todos, estou com umas duvidas aqui, bom para começar, a classe contaCorrente implementou a interface Comparable certo? e porque tive que passar o objeto ContaCorrente como parametro nessa implementação? oque exatamente essa implementação faz? oque eu entendi é que implementei ela, e automaticamente, tive que gerar um metodo, sobrescrever o metodo compareto, oque eu entendi desse metodo, é um metodo que verifica qual é o maior e o menor saldo, para retornar os saldos em ordens crescentes correto? no caso, não seria aconselhável criar um metodo na classe ContaCorrente para fazer o mesmo resultado e sem ter que implementar o Comparable? e eu sempre me perco nos metodos que retorna por exemplo return 1 ou retorna 0, poderia me explicar passo a passo esse metodo por favor? so me perco o porque do retorn -1 ou 1 ou 0. o metodo é esse

@Override
    public int compareTo(ContaCorrente outra) {
        if(this.getSaldo() > outra.saldo){
            return 1;
        }    
        if(this.getSaldo() < outra.getSaldo()){
            return -1;
        }    
            return 0;
    }
3 respostas

Oi Alisson,

Através do método compareTo vc define o critério de comparação entre dois objetos, no seu caso duas ContaCorrente.

A primeira conta é representada através do this, a segunda vc está recebendo como parâmetro (outra).

Dentro do método vc precisa definir quando um conta é "maior", igual ou "menor" do que a outra. Na sua implementação a comparação é baseada no atributo saldo.

O contrato do método compareTo diz que devemos devolver um valor positivo (por exemplo 1) quando o this é maior do que outra, devemos devolver 0 quando as contas são iguais, e devolver um valor negativo (por exemplo -1) quando o this é menor do que outra.

Repare tbm que vc definiu no método compareTo apenas o critério de comparação , mas quem realmente ordena, quem realmente implementou o algoritmo de comparação é o método Collections.sort().

Tudo bem?

abs

Olá, Alisson. Tudo bom?

Primeiramente, precisamos do método compareTo() pois o Collections.sort() utilizará este método para ordenar sua lista. Já que descrever como comparar os objetos da nossa classe é algo muito comum (diversas classes do proprio java também implementam esse comportamento) o pessoal já desenvolveu um "contrato" (interface) garantindo que todos que implementarem serão capazes de se comparar. Se você quiser, pode dar uma olhada na propria documentação do java:

http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#sort(java.util.List)

Você perceberá que, obrigatóriamente, precisamos fornecer uma lista com objetos comparáveis. A implementação da interface é uma forma bem eficiente de garantir que todos os objetos daquela classe serão comparaveis. Além disso, ganhamos mais uma forma de nos referênciar a todos que são comparaveis. Outra vantagem da interface.

Você poderia escrever outro método que compare os objetos da sua classe, porém a ordenação deveria ser feita por você ao invés de usar o Collections.sort().

Quanto a lógica do método compareTo(), precisamos de alguma forma representar 3 situações: caso seja maior, menor ou igual. Por isso retornamos -1 para menor, 0 para igual e 1 para maior. O critério para definir cada um desses casos, somos nós quem decidimos. Portanto:

public int compareTo(ContaCorrente outra) {
        if(this.getSaldo() > outra.saldo){
            return 1;
        }    
        if(this.getSaldo() < outra.getSaldo()){
            return -1;
        }    
            return 0;
    }

Neste código, estamos dizendo que caso o saldo da conta que chamou o método(this) seja maior que o saldo da conta com a qual estamos comparando (ContaCorrente outra), retornamos 1. Ou seja, estamos dizendo que a conta que chamou o método é maior que que a conta outra. Depois verificamos o caso contrario, se o saldo é menor retornamos -1. Ou seja, se o saldo da conta que chamou o método for menor que o saldo da conta outra dizemos que a conta que chamou o método é menor que a conta outra. E o ultimo caso, no qual o saldo não é nem maior nem menor, retornamos 0 dizendo que são iguais. A ideia de utilizar o -1, 0 e 1 é que precisamos representar 3 casos e com, por exemplo, boolean apenas conseguiriamos representar 2: true ou false.

Quanto a receber ContaCorrente no método compareTo(), recebemos ContaCorrente, neste exemplo, pois o método está escrito na classe ContaCorrente. Então, é dedutivel que estaremos comparando duas contas corrente. Recebemos esse objeto como parametro para que possamos comparar quem chamar o método com algum outro objeto (toda comparação precisa de pelo menos 2 coisas) neste caso comparamos o this (quem chama) com o outra (conta que recebemos por parametro).

Espero ter ajudado de alguma forma =)

Obrigado pela explicação, pois tiro uns 90 % da minha duvida, os outros 10 tem que ser na pratica mesmo kkk, valeu André. ah e vlw tbm nico