Por que as classes Java não podem ter campos abstratos como podem ter métodos abstratos?
Por exemplo: eu tenho duas classes que estendem a mesma classe base abstrata. Cada uma dessas duas classes tem um método idêntico, exceto por uma constante String, que por acaso é uma mensagem de erro, dentro delas. Se os campos pudessem ser abstratos, eu poderia tornar essa constante abstrata e puxar o método para a classe base. Em vez disso, tenho que criar um método abstrato, chamado getErrMsg()
neste caso, que retorna String, sobrescrever esse método nas duas classes derivadas e, então, posso puxar o método (que agora chama o método abstrato).
Por que eu não poderia simplesmente tornar o campo abstrato para começar? O Java poderia ter sido projetado para permitir isso?
Respostas:
Você pode fazer o que descreveu tendo um campo final em sua classe abstrata que é inicializado em seu construtor (código não testado):
Se sua classe filha "esquecer" de inicializar o final por meio do super construtor, o compilador dará
um aviso deerro, assim como quando um método abstrato não é implementado.fonte
Base
precisa ser declaradoabstract
.Não vejo sentido nisso. Você pode mover a função para a classe abstrata e apenas substituir algum campo protegido. Não sei se funciona com constantes, mas o efeito é o mesmo:
Então, o que você quer dizer é que você quer impor a implementação / substituição / qualquer coisa
errorMsg
nas subclasses? Achei que você só queria ter o método na classe base e não sabia como lidar com o campo na época.fonte
protected String errorMsg;
que impõe de alguma forma que eu configure o valor nas subclasses. É semelhante àquelas classes abstratas que realmente implementam todos os métodos como espaços reservados para que os desenvolvedores não tenham que implementar todos os métodos, embora não precisem deles.protected String errorMsg;
que não impor que você definir o valor em subclasses.Obviamente, ele poderia ter sido projetado para permitir isso, mas nos bastidores ainda teria que fazer o despacho dinâmico e, portanto, uma chamada de método. O design de Java (pelo menos nos primeiros dias) foi, até certo ponto, uma tentativa de ser minimalista. Ou seja, os designers tentaram evitar a adição de novos recursos se eles pudessem ser facilmente simulados por outros recursos já existentes na linguagem.
fonte
Lendo seu título, pensei que você estava se referindo a membros de instância abstratos; e eu não via muito uso para eles. Mas membros estáticos abstratos é outra questão completamente.
Muitas vezes desejei poder declarar um método como o seguinte em Java:
Basicamente, gostaria de insistir que as implementações concretas de minha classe pai fornecem um método de fábrica estático com uma assinatura específica. Isso me permitiria obter uma referência a uma classe concreta com
Class.forName()
e ter certeza de que poderia construir uma em uma convenção de minha escolha.fonte
@autowired T fieldName
. SeT
for definido como algo comoT extends AbstractController
, o apagamento do tipo faz com que o campo seja gerado como um tipoAbstractController
e não pode ser autowired porque não é concreto e não é único. Em geral, concordo que não têm muita utilidade para eles e, portanto, não pertencem ao idioma. O que eu não concordaria é que NÃO há uso para eles.Outra opção é definir o campo como público (final, se preferir) na classe base e, em seguida, inicializar esse campo no construtor da classe base, dependendo de qual subclasse está sendo usada no momento. É um pouco obscuro, pois introduz uma dependência circular. Mas, pelo menos, não é uma dependência que pode mudar - ou seja, a subclasse existirá ou não, mas os métodos ou campos da subclasse não podem influenciar o valor de
field
.fonte