Orientacao Objetos

Revisão

Imagina que você resolveu criar sua lista de amigos onde cada amigo com (nome, apelido, data de nascimento) contenha dados de contato com (email, whatsapp, nickname instagram) e endereço com (logradouro, numero, cidade, sigla do estado).

  • Defina a estrutura de classes que achar necessária
  • Crie instâncias de ao menos 03 dos seus melhores amigos
  • Imprima informações aleatórias de cada amigo, exemplo: Gleyson Sampaio tem o email gleyson@digytal.com.br

Equals versus ==

== versus equals: Quando estamos comparando valores primitivos, como int, double, float, long, short, byte, char, boolean, usamos o operador ==. Quando estamos comparando objetos, usamos o método equals.

Comparações Avançadas

Quando se refere a comparação de conteúdos na linguagem, devemos ter um certo domínio, de como o Java trata o armazenamento destes valores na memória.

✔️ Conclusão
Quando estiver mais familiarizado com a linguagem, recomendamos se aprofundar no conceito de espaço em memória Stack versus Heap.

Vamos a alguns exemplos para ilustrar:

Valor e referência: Precisamos entender que em Java tudo é objeto, logo, objetos diferentes podem ter as mesmas características, mas lembrando, são objetos diferentes.

// ComparacaoAvancada.java
public static void main(String[] args) {

        String nome1 = "JAVA";
        String nome2 = "JAVA";
        
        System.out.println(nome1 == nome2); //true

        String nome3 = new String("JAVA");
        
        System.out.println(nome1 == nome3); //false

        String nome4 = nome3;

        System.out.println(nome3 == nome4); //true
        
        //equals na parada
        System.out.println(nome1.equals(nome2)); //??
        System.out.println(nome2.equals(nome3)); //??
        System.out.println(nome3.equals(nome4)); //??

}

Comparando números wrappers

// ComparacaoAvancada.java
 public static void main(String[] args) {
        
        int numero1 = 130;
        int numero2 = 130;
        System.out.println(numero1 == numero2); //true
        
        Integer numero1 = 130;
        Integer numero2 = 130;
        
        
        System.out.println(numero1 == numero2); //false
        //uma grande pegadinha, até 127 o resultado seria true
        
        // A razão pela qual o resultado é false, é devido o Java tratar os valores
        // Como objetos a partir de agora.
        // Qual a solução ?
        // Quando queremos comparar objetos, usamos o método equals
         System.out.println(numero1.equals(numero2)); 
 }

Comparando objetos

Chegou o momento mais temido ao tratar comparação de valores, a fomosa comparação entre objetos na linguagem Java.

Vamos imaginar que uma fábrica de automóveis acaba de fabricar 05 veículos da mesma, cor, marca e modelo. Transcrevendo para Java, esta seria a estrutura de código:

//arquivo Carro.java
class Carro {
    //atributos de mesmo tipo
    String cor, marca, modelo;
    
    //construtor
    Carro (String cor, String marca, String modelo){
        this.cor = cor;
        this.marca = marca;
        this.modelo = modelo;
    }
    
    
}

//arquivo FabricaCarro.java
public class FabricaCarro {
    public static void main (String [] args){
        Carro carro1 = new Carro("branca","fiat","palio");
        Carro carro2 = new Carro("branca","fiat","palio");
        Carro carro3 = new Carro("branca","fiat","palio");
        Carro carro4 = new Carro("branca","fiat","palio");
        Carro carro5 = new Carro("branca","fiat","palio");
        
        //case01
        System.out.println(carro1 == carro2); //false
        //case02
        System.out.println(carro1.equals(carro2)); //false
    }
}
🔔 Atenção
Mesmo objetos contendo as mesmas características ainda serão considerados objetos diferentes até que você determine algum atributo de identificação utilizando equals e hashcode

Melhorando nosso contexto

//arquivo Carro.java
class Carro {
    //atributos de mesmo tipo
    String cor, marca, modelo;
    
    //construtor
    Carro (String cor, String marca, String modelo){
        this.cor = cor;
        this.marca = marca;
        this.modelo = modelo;
    }

    //identificador de igualdade
    //os 3 atributos precisem ser idênticos
    @Override
    public boolean equals(Object o) {
      if (this == o) return true;
      if (o == null || getClass() != o.getClass()) return false;
      Carro carro = (Carro) o;
      return Objects.equals(cor, carro.cor) && Objects.equals(marca, carro.marca) && Objects.equals(modelo, carro.modelo);
    }
  
    @Override
    public int hashCode() {
      return Objects.hash(cor, marca, modelo);
    }
}

//arquivo FabricaCarro.java
public class FabricaCarro {
    public static void main (String [] args){
        Carro carro1 = new Carro("branca","fiat","palio");
        Carro carro2 = new Carro("branca","fiat","palio");
        Carro carro3 = new Carro("branca","fiat","palio");
        Carro carro4 = new Carro("branca","fiat","palio");
        Carro carro5 = new Carro("branca","fiat","palio");
        
        //case01
        System.out.println(carro1 == carro2); //false
        //case02
        System.out.println(carro1.equals(carro2)); //true
        System.out.println(carro1.equals(carro3)); //true
        System.out.println(carro1.equals(carro4)); //true
        System.out.println(carro1.equals(carro5)); //true

        //case03
        Carro carro6 = carro1; // não é um novo carro, mas sim, uma referência ao mesmo carro
        System.out.println(carro6 == carro1); //??
        System.out.println(carro6.equals(carro1)); //??
      
    }                           
}
🔔 Atenção
Agora mesmo sendo objetos diferentes, eles são considerados idênticos diante das características.

Hora da verdade

Com base no cenário acima, como você implementaria a classe Carro de forma que uma fábrica de automóveis tivesse controle de cada veículo fabricado individualmente mesmo onde os mesmos pudessem ter a mesma cor, marca e modelo ?

Já pensou?
O que faria um veículo ser único no mundo real ?

✔️ Conclusão
O que precisamos compreender é que: enquanto o == compara referência de objetos, o método equals compara características. Logo se duas variáveis apontam para um mesmo objeto == logo ao usar equals será true.

Referências