Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Duvida sobre Generics em Java

Opa, então estou tentando implementar alguns padrões de SOLID em meus novos projetos, porém algumas tenho empacado na questão de segregação de interfaces estou tendo problemas, estou querendo criar um service generics com um crud completo...

public interface ServiceImpl <E>{

    ResponseEntity<List<E>> listar();
    ResponseEntity<E> buscar(Long id);
    ResponseEntity<E> salvar(E e);
    ResponseEntity<E> atualizar(E e, Long id);
    ResponseEntity<E> deletar(Long id);
    void copiarDTOparaEntidade(E entidade, E dto);
    void copiarDTOparaEntidadeUpdate(E entidade, E dto, Long id);

}

Como visto a cima o ServiceImpl foi feito usando generics aonde eu deixo generico o salvar e atualizar por receberem DTOs expecificos de suas entidades, porem quando eu passo a implementar em uma classe esse service, acontede isso.

    @Override
    public ResponseEntity<AuditoriaDTO> salvar(Object o) {
        return null;
    }

O campo vira um object, logo não consigo trabalhar com o dto sem instacialo, e tbm não consigo alterar o object para a classe que necessito sem que ele quebre a implementação, se alguem souber como trabalhar nessas situações ficarei grato pelas dicas e ajudas!

2 respostas
solução!

Olá, Weverton!

Entendo que você está tendo dificuldades ao implementar a interface ServiceImpl em uma classe específica devido ao fato de que o campo está sendo tratado como Object e você precisa trabalhar com um DTO específico.

Uma possível solução para esse problema é utilizar o tipo genérico da interface ServiceImpl na classe que você está implementando. Dessa forma, você poderá definir o tipo do DTO que será utilizado na implementação do método salvar.

Por exemplo, se você estiver implementando a interface ServiceImpl para uma entidade chamada Auditoria, você poderia fazer algo assim:

public class AuditoriaServiceImpl implements ServiceImpl<AuditoriaDTO> {

    @Override
    public ResponseEntity<List<AuditoriaDTO>> listar() {
        // implementação do método listar
    }

    @Override
    public ResponseEntity<AuditoriaDTO> buscar(Long id) {
        // implementação do método buscar
    }

    @Override
    public ResponseEntity<AuditoriaDTO> salvar(AuditoriaDTO dto) {
        // implementação do método salvar
    }

    // restante das implementações dos métodos da interface
}

Dessa forma, você estará definindo o tipo genérico AuditoriaDTO na implementação da interface ServiceImpl, permitindo que você trabalhe com o DTO específico.

Bons estudos!

Haaaaa muito obrigado! demorei pra entender que eu tinha que definir o valor dos campos generics.

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