TransWikia.com

Em Java, getter e setter abstrato é correto?

Stack Overflow em Português Asked by MARCOS DAVID ALMEIDA DE SOUSA on September 27, 2021

Eu tenho uma classe pai abstrata Usuario. E uma classe filha Usuario_Adulto.

O atributo idade está na classe abstrata Usuario. Para validá-lo fiz um método setter abstrato na classe pai, pois o atributo é protected, mas e se fosse private? Como poderia validá-lo na classe filha?

Está certo fazer isso?

One Answer

Tenho medo desse tipo de herança, só não afirmo que ela está errada porque não tenho informações suficientes. Até pode estar certo, mas só poderia afirmar entendendo cada detalhe. Programar, especialmente orientado a objeto, é entender cada detalhe. Por alguma razão algumas pessoas acham que isso não é necessário.

Aproveito para dizer que o que chama de atributo na verdade é correto chamar de campo.

Também quero dizer que as pessoas abusam e usam errado setters e getters.

Se tiver um motivo para qualquer um dos dois ser abstrato então eles devem ser mesmo. O fato de ser abstrato pode ajudar a herança ser um pouco mais certa, ainda não garanto, mas se Usuario não pode ser instanciada é um indício de algo bom.

O que deseja? Se quer a implementação seja dada apenas na classe concreta então parece que é só fazer isso.

Se você quer só chamar na classe Usuario um método que ainda é abstrato para fazer alguma validação, pode fazer isso sem problemas, todo esse mecanismo foi criado para ser assim mesmo. Quem chamar não precisa saber como está sendo feito lá dentro, não precisa nem saber que lá dentro na própria classe não tem implementação, ele só precisa chamar algo que ele sabe que existe, que é o contrato do método. Obviamente que só funcionará quando implementar o método em uma classe herdada, o que é a única forma de instanciar esse tipo.

E de fato se o método for acessar um campo da classe mãe e a implementação da classe concreta precisa poder acessar o campo lá na classe mãe e então ele não pode ser private, teria que ser protected.

Ao mesmo tempo pode não ser a forma certa. Pode estar violando a abstração. Talvez o que precise não é um método abstrato. Pode ser que queira um método implementado na classe mãe que acessa o campo privado, e aí na classe filha você reimplementa o método fazendo o que quer e chamando em determinado momento o método da classe mãe quando for acessar o estado que está em um campo da classe mãe.

Algo assim:

@Override
public void setA(int value) {
    if (value > 0) super.setA(value);
}

Coloquei no GitHub para referência futura.

Correct answer by Maniero on September 27, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP