9
respostas

Duvida sobre sintaxe e Lombok

Ola, tenhi uma duvida.

Em uma determinada parte encontrei o codigo abaixo:

 public DadosDetalhamentoMedico (Medico medico) {
        this(medico.getId(), medico.getNome(), medico.getEmail(), medico.getCrm(), medico.getTelefone(), medico.getEspecialidade(), medico.getEndereco());
    }

Naum entendo pq dentro do metedo ele abre o this abre um paraenteses e dentro vem os getters dos atributos. Normalmente settaria um por um como this.id = medico.getId(), porem ao fazer desta retornou um erro canonical. Alguem poderia me dar uma breve explicacao sobre essa sentaxe this.(codigo) e do tal erro canonical.

Segundo... possuo usar Lombok para gerar construtores na classe record?

Obrigado e desculpem as perguntas!

9 respostas

Olá Rodrigo

A palavra-chave "this" em Java refere-se ao objeto atual em um método ou construtor.

O uso mais comum da palavra-chave "this" é eliminar a confusão entre atributos de classe e parâmetros com o mesmo nome. Exemplo:

public class Main {
  int x; // recebe o valor 0

  // Constructor com parâmetro x
  public Main(int x) {
    this.x = x;
  }

  // Chama o construtor
  public static void main(String[] args) {
    Main myObj = new Main(5);
    System.out.println("Valor de x = " + myObj.x);
  }
}

Se você omitir a palavra-chave "this" no exemplo acima, a saída seria "0" em vez de "5".

Entao no exemplo acima OK, o que fiquei curioso eh q quando eu tento injetar desta forma ele me da o erro canonical e quando eu faco do jeito do professor funciona.

Long id;
String nome;
e por ai vai...
//Eu faria assim mas da erro canonical
public DadosDetalhamentoMedico (Medico medico) {
        this.id=medico.getId();
        this.nome = medico.getNome();
        e por ai vai...
    }
    //ja do jeito dele funciona..
    public DadosDetalhamentoMedico (Medico medico) {
        this(medico.getId(), medico.getNome(), ...

Isso q me deixou confuso, mas obrigado pela ajuda Otavio

Olá Rodrigo, tudo bem?

Me envia o código completo da sua classe DadosDetalhamentoMedico e Medico, por favor

Claro Otavio, obrigado por estar me ajudando.

package med.voll.api.domain.medico;
import med.voll.api.domain.endereco.Endereco;
public record DadosDetalhamentoMedico(Long id,
                                      String nome,
                                      String email,
                                      String crm,
                                      String telefone,
                                      Especialidade especialidade,
                                      Endereco endereco) {

    public DadosDetalhamentoMedico (Medico medico) {
        this(medico.getId(), medico.getNome(), medico.getEmail(), medico.getCrm(), medico.getTelefone(), medico.getEspecialidade(), medico.getEndereco());

    }

}
package med.voll.api.domain.medico;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import med.voll.api.domain.endereco.Endereco;


@Table(name = "medicos")
@Entity(name = "Medico")
@Getter
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = "id")
public class Medico {


    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String nome;
    private String email;
    private String telefone;
    private String crm;

    private boolean ativo;


    @Enumerated(EnumType.STRING)
    private Especialidade especialidade;

        @Embedded
    private Endereco endereco;

    public Medico(DadosCadastroMedico dados) {
        this.nome = dados.nome();
        this.email = dados.email();
        this.telefone = dados.telefone();
        this.crm = dados.crm();
        this.especialidade = dados.especialidade();
        this.endereco = new Endereco(dados.endereco());
        this.ativo = true;
    }


    public Endereco getEndereco() {
        return endereco;
    }

    public void setEndereco(Endereco endereco) {
        this.endereco = endereco;
    }

    public void atualizarInformacoes(DadosAtualizacaoMedico dados) {
        if (dados.nome() != null) {
            this.nome = dados.nome();
        }
        if (dados.telefone() != null) {
            this.telefone = dados.telefone();
        }
        if (dados.endereco() != null) {
            this.endereco.atualizarInformacoes(dados.endereco());
        }
    }

    public void excluir() {
        this.ativo = false;
    }
}

Teoricamente ambos os jeitos deveriam funcionar:

public DadosDetalhamentoMedico (Medico medico) {
        this.id=medico.getId();
        this.nome = medico.getNome();
        e por ai vai...
    }

e

public DadosDetalhamentoMedico (Medico medico) {
        this(medico.getId(), medico.getNome(), ...

o primeiro você chama atributo por atributo e faz uso dos gets da classe Médico, já a segunda opção você chama o this (construtor) da classe

Estranhei o primeiro nao funcionar, mas obrigado

Opa, eu tentei simular aqui com o código que você enviou e deu certo, você consegue subir no github o código da forma que está dando erro?

No guit hub nem tentei... tentei de novo e deu certo! Agora viajei, desculpa incomodar e vlw o esforco

Opa imagina Rodrigo, qualquer coisa só voltar a postar aqui

Mas no fim das contas, você descobriu qual era o problema original?

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software