es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Qué se debe hacer si necesito crear una instancia de una clase abstracta o una interfaz utilizando Java?

Estoy aprendiendo Java y el framework Spring, así que, en mi aplicación web Java tengo una interfaz Client y 2 clases que implementan esta interfaz – PersonClient y CompanyClient. También hay una interfaz Account y una clase que implementa esta interfaz – DebitAccount:

package com.bankapp.bankwebapplication.models;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class DebitAccount implements Account {
    @Id
    private Long id;
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }

    private Long clientId;
    public Long getClientId() { return clientId; }
    public void setClientId(Long clientId) { this.clientId = clientId; }

    private Long amountOfMoney;
    public Long getAmountOfMoney() { return amountOfMoney; }
    public void setAmountOfMoney(Long amountOfMoney) { this.amountOfMoney = amountOfMoney; }
}

Esta clase tiene el campo clientId. Y aquí está el problema. Como puedes ver, esto no es una base de datos, así que no puedo simplemente crear private Long clientId. Debe ser una clase en lugar de un tipo de dato Long, pero tengo una interfaz y no puedo crear una instancia de una interfaz, pero entiendo que no puedo dejarlo así, debe ser un tipo de dato de clase, no Long.

Estaba pensando en una clase abstracta, pero al igual que la interfaz, se trata de polimorfismo y tampoco puedo crear una instancia de una clase abstracta. ¿Cómo puedo resolver eso? ¿O debería simplemente crear dos campos para CompanyClient y PersonalClient?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como PersonClient y CompanyClient están implementando la interfaz Client, puedes agregar una referencia a la interfaz Client en la clase DebitAccount, en lugar de una referencia directa a PersonClient o CompanyClient. De esta manera, puedes almacenar una referencia a un objeto que implemente la interfaz Client, ya sea un PersonClient o un CompanyClient.

    Aquí tienes una clase DebitAccount actualizada con una referencia a Client:

    package com.bankapp.bankwebapplication.models;
    
    import javax.persistence.Entity;
    import javax.persistence.Id;
    
    @Entity
    public class DebitAccount implements Account {
        @Id
        private Long id;
        public Long getId() { return id; }
        public void setId(Long id) { this.id = id; }
    
        private Client client;
        public Client getClient() { return client; }
        public void setClient(Client client) { this.client = client; }
    
        private Long amountOfMoney;
        public Long getAmountOfMoney() { return amountOfMoney; }
        public void setAmountOfMoney(Long amountOfMoney) { this.amountOfMoney = amountOfMoney; }
    }
    

    Ahora, puedes establecer un PersonClient o un CompanyClient como el client para un objeto DebitAccount:

    PersonClient personClient = new PersonClient();
    DebitAccount debitAccount = new DebitAccount();
    debitAccount.setClient(personClient);
    
    CompanyClient companyClient = new CompanyClient();
    DebitAccount debitAccount = new DebitAccount();
    debitAccount.setClient(companyClient);
    

    Este diseño también te permite agregar más tipos de clientes en el futuro, simplemente implementando la interfaz Client.

Comments are closed.