Classe normal ou abstrata

nunca consegui compreender para que serve exatamante a classe abstrata em java ela é apenas para ser herdade só isso ? vi algumas pessoas falando que é muito pouco usada e a interface eu compreendo o uso e até gosto para ajudar na injeção de dependencia mas não sei se tenho conhecimento de todos os usos possiveis

Basicamente é isso.

Isso pq classes abstratas geram um forte acoplamento no código, dificultando um pouco a manutenção do sistema, ainda mais se usada em cenários não tão apropriados.


Como o próprio nome diz, classes abstratas serem para permitir vc criar conceitos abstratos do seu negócio no código da sua aplicação. Vou tentar exemplificar:

Imagine um sistema de controle financeiro onde o usuário pode lançar receitas e despesas.

Nessa descrição já podemos imaginar uma modelagem onde há as classes: Receita e Despesa, por exemplo (claro que pode ser modelado de outras maneiras, mas vamos usar assim para fins didáticos).

Como sabemos que o conceito de receita e despesa são algo bem próximo e , em determinado momento iremos listar todos os lançamentos juntos para o usuário visualizar, podemos pensar numa forma de abstrair isso usando uma classe, por exemplo, chamada Lancamento.

Essa classe será abstrata, pois não poderá ser instanciada por si só, pois depende de conceitos concretos como “Receita” e “Despesa”. Assim, essa classe terá propriedades e comportamentos comuns dos dois tipos concretos e vc conseguirá manter de forma mais tranquila seu código e fazer coisas assim, por exemplo:

List<Lancamento> lancamentos = new ArrayList<>();
lancamentos.add(new Receita());
lancamentos.add(new Despesa());
2 curtidas

compreendi muito obrigado por esclarecer minhas duvidas

Já foi explicado, mas vou dizer o mesmo também, com outras palavras: é para tornar mais barato a manutenção do sistema no longo prazo.
Com classe abstrata você deixa claro no código que aquela classe não faz sentido nem tem utilidade nenhuma existir por si mesma, ela só faz sentido existir sendo parte herdada por outras classes.

Dependendo de como você usar, pode alcançar uma produtividade imensa, porém, muitas vezes ao custo de aumentar a complexidade. Um programador experiente analisar o trade-off (custo beneficio) de decisões. Muitas vezes isso gera discussões infinitas em revisões de pull-requests, mas isso é outra história.

1 curtida

Classes abstratas são incríveis em dadas circunstancias e elas tem razão de existirem.
Sem elas, notará que em dado momento falta alguma coisa.
O codigo fica muito melhor, em termos de manutenção tambem.

1 curtida

A ideia de uma classe abstrata é definir alguns comportamentos básicos que todas as sub-classes terão, mas sem a obrigação de definir tudo (pois o restante ficaria a cargo das subclasses).

No próprio JDK temos alguns exemplos, como a classe java.util.AbstractSet. Segundo a documentação, ela define apenas três métodos: equals, hashCode e removeAll.

Porém, esta classe implementa a interface java.util.Set, ou seja, se não fosse abstrata, ela seria obrigada a implementar todos os métodos definidos pela interface (e veja na documentação que a lista é grande). Mas como ela é abstrata, não é obrigada a implementar tudo, deixando isso a cargo das subclasses.

Com isso eu garanto duas coisas:

  • todas as subclasses de AbstractSet já terão os métodos equals, hashCode e removeAll implementados (não preciso duplicar o código em todas elas)
  • indico que não é para usar AbstractSet diretamente (pois por ser abstrata, não pode ser instanciada), ela é apenas um “rascunho” a ser completado pelas subclasses (e estas sim é que eu devo usar)

Com isso, as subclasses podem se concentrar em apenas implementar a parte que lhes interessa, sem se preocupar com a parte comum (os três métodos que AbstractSet já implementou) e que é igual pra todos. Assim, cada uma pode implementar de maneira específica, de acordo com suas características - por exemplo, HashSet não garante a ordem dos elementos, enquanto TreeSet garante, ou seja, a forma como elas trabalham internamente é diferente, então cada uma vai implementar os métodos da sua própria maneira (apenas o comportamento dos métodos equals, hashCode e removeAll serão iguais, embora elas também possam sobrescrever se quiserem).

1 curtida