Eu estava lendo o site do JDOM .
Por que a API JDOM é definida em termos de classes concretas em vez de interfaces?
Jason Hunter resume os argumentos em relação a uma API baseada em interface para JDOM:
Com as interfaces, tudo se torna uma fábrica, os elementos precisam ser 'importados' para novos documentos, em vez de apenas adicionados, recursos como serialização de longo prazo não podem ser garantidos e a lista continua.
Começamos com interfaces, na verdade. Durante nossa revisão de pré-lançamento para alguns colegas, recebemos o feedback de que deveríamos tentar aulas concretas. Fizemos, e o design foi muito melhor para isso.
Eu sou um designer iniciante. Todo o conselho que ouvi até agora é contra o uso do design com classes concretas.
Pode estar usando classes concretas são apropriadas em determinados lugares. Existem problemas de classe comuns para os quais o uso de classes concretas no design é bom?
fonte
Respostas:
[EDIT] O site do JDOM usa java.io.File como exemplo, mas esse é definitivamente um design baseado em interface, pois é possível manipular uma instância de java.io.File como se fosse apenas um serializável. Nesta situação, apenas "criadores" conheceriam a classe concreta
fonte
No site do JDOM:
Ou seja, na época em que o Java 1.3 estava sendo introduzido. Não havia nada em termos de maturidade quando se tratava de desenvolvimento Java - os desenvolvedores mais experientes tinham apenas 4 anos usando Java na melhor das hipóteses. Não havia recipientes de IoC amplamente utilizados, nem Hibernate. O Apache Struts estava apenas começando.
O que é tudo para dizer que Jason e Brett estavam errados. Muitas pessoas ainda não "entenderam". Se eles tinham experiência em C ++, bem, você não precisava de interfaces em C ++ (bem, elas estavam lá em C ++, mas você realmente não precisava delas, certo?), Por que diabos as usa em Java? Bem, há muitas boas razões, para as quais outras pessoas podem direcioná-lo.
Eles estavam definitivamente errados sobre
Java não permite herança múltipla de classes, mas permite a implementação de múltiplas interfaces. Isso pode fazer uma diferença real.
fonte
Lembre-se, primeiro, que no Desenvolvimento de software existem várias maneiras de resolver um problema e, se algum desenvolvedor usa uma técnica diferente da sua, isso não significa que está errado.
Um desses casos é "interfaces" versus "base" "classes". Há situações em que o mesmo objetivo pode ser alcançado com as duas técnicas.
Para tornar as coisas mais complicadas, existem vários usos de interfaces, apenas para mencionar:
Sua pergunta se aplica ao primeiro ponto.
Quando você deseja desenvolver uma hierarquia de classes, não apenas uma única classe, e várias classes pretendem compartilhar alguns recursos específicos, você pode começar com uma classe base, mesmo que isso possa ser feito com uma interface.
E deixe interfaces para os outros cenários.
Um bom exemplo são bibliotecas de widgets (controles).
Eu sugiro que dê uma olhada em outras linguagens de programação, como elas usam interfaces e classes como: PHP, Delphi (Object Pascal), C #.
Felicidades.
fonte
Você geralmente deseja uma interface para qualquer coisa que seja passada como parâmetro ou retornada, essencialmente para poder dissociar a classe de suas dependências.
Portanto, se estamos procurando uma aula, nunca repassamos normalmente exceções que vêm à mente. Não sou desenvolvedor de Java, mas certamente em outras linguagens semelhantes não acho que vi interfaces definidas por exceções.
fonte
As regras de design da API são realmente uma coisa específica. Não tenho certeza se você deve concluir alguma coisa dessas perguntas frequentes em termos de como deve criar seu código diário.
Para o seu código regular, ainda é verdade que você usará a herança de interface ou classe abstrata com muito mais frequência do que o IMO de herança de baunilha.
Para entender bem essa regra, você deve se colocar não do ponto de vista de uma classe derivada versus sua superclasse, mas do ponto de vista de um objeto que depende de outro objeto. É quase sempre melhor depender de uma abstração do que de uma implementação concreta, pois permite que você aceite uma série inteira de classes diferentes como dependências, confiando no contrato e não nos detalhes da implementação.
O primeiro uso para isso é muitas vezes em testes de unidade - se você realmente quer unidade de teste de sua classe em completo isolamento, você faz isso contra falsos implementações de suas dependências que são diferentes das implementações reais que serão utilizados na produção.
fonte