Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Solucionado (ver solución)
Solucionado
(ver solución)
2
respuestas

[Duda] Request GET

Me podrian sacar de esta duda por favor.. Cual es la diferencia entre estos dos metodos constructores..

public DatosListadoPaciente(Paciente p) {
    this.nombre = p.getNombre();
    this.email = p.getEmail();
    this.documento = p.getDocumentoIdentidad();
}

En el primer metodo constructor, donde asigno los valores de los atributos del objeto paciente directamente a los atributos de la clase DatosListadoPaciente..me genera error ("constructor is not canonical, so its first statement must invoke another constructor of class DatosListadoPaciente")

y este metodo constructor

public DatosListadoPaciente(Paciente p) {
    this(p.getNombre(), p.getEmail(), p.getDocumentoIdentidad());
}

Pero con el segundo metodo constructor no me genera el error, me podrian sacar de la duda, por favor.. gracias..

2 respuestas
solución!

Hola Janson, si entiendo bien el problema es que tienes múltiples constructores en una clase. En Java a veces en mejor reutilizar los códigos usando this().

public DatosListadoPaciente(Paciente p) {
    this.nombre = p.getNombre();
    this.email = p.getEmail();
    this.documento = p.getDocumentoIdentidad();
}

Este método es perfectamente válido en la mayoría de los casos, pero en tu caso parece que hay una restricción o regla en el entorno que exige que todo constructor debe invocar a otro constructor (es decir, debe ser "canónico"). Eso significa que el constructor debe delegar a otro constructor en su primera línea mediante this(), como se ve en el segundo ejemplo.

public DatosListadoPaciente(Paciente p) {
    this(p.getNombre(), p.getEmail(), p.getDocumentoIdentidad());
}

Este constructor hace un buen uso de this, que apunta a otro constructor en la misma clase que espera tres parámetros: nombre, email y documento de identidad. Este estilo cumple con la regla canónica, por lo que no ves ningún error.

Es mejor usar el segundo código, porque el método es más limpio y cumple con las reglas de el primer llamado a un constructor debe ser otro constructor de la misma clase.

Documentación de this

Documentación de super

Muchas gracias. aunque consulte un poco mas, y argumentan que los records ya tiene un constructor canonico automatico, por ende toma los mismos parametros de lo campos record y los utiliza para inicializar, por lo tanto al intentar inicializar un record de la misma forma que una clase normal

public DatosListadoPaciente(Paciente p) {
    this.nombre = p.getNombre();
    this.email = p.getEmail();
    this.documento = p.getDocumentoIdentidad();
}

, se prenstan el error mencionado..