As interfaces dependem de classes concretas?

9

Estou criando uma interface em Java para manipulador de erros personalizado.

Deseja passar um objeto de erro de argumento, mas preciso que ele seja filho da Exceptionclasse.

Posso usar meu nome de classe definido em uma interface?

Não tornará a interface menos em termos de não depender de nenhuma implementação?

Eu tento fazer algo assim:

public class CustomException {
    /* ... Implementation ... */
}

public interface Interface {

    void onError(CustomException ex);

}
nikachx
fonte
Você está tentando perguntar se não há problema em herdar outra classe em uma interface?
Snoop
@StevieV Não. Eu editei a pergunta, olhe.
Nikachx 23/10
11
@AndresF. É apenas um exemplo e pode ser aplicado a qualquer linguagem OO sobre o uso de classes em interfaces.
Nikachx 23/10
3
Diga-me: faz CustomExceptionparte da implementação ou parte da interface?
user253751
2
@nikachx Não entendo o que você quer dizer com "seguro". De que maneira é Stringmais seguro do que CustomException? Por que importa se CustomException, por sua vez, tem outras dependências?
24516 Andres F.

Respostas:

2

Primeiro eu tenho que apontar o fato de que CustomExceptionnão se estende, Exceptionentão não é realmente um Exception.

Dito isto:

Se você não se importa com o Princípio da inversão de dependência , deixe-o como está. Não há problema em uma interface depender de classes concretas, por exemplo, muitas interfaces dependem Stringou Objectsão classes concretas . O fato é que tenderíamos a acreditar que as classes que pertencem ao Java SDK são mais estáveis ​​(menos propensas a alterações de quebra de código) do que as que escrevemos.

Por outro lado:

Se você deseja seguir o DIP (que tem inúmeros benefícios e é minha recomendação), é necessário fazer uma de duas coisas:

Opção 1

  • Faça CustomExceptionresumo
  • Mantenha void onError(CustomException ex)como está

opção 2

  • Faça CustomExceptionuma interface
  • Mantenha void onError(CustomException ex)como está

Com qualquer uma dessas opções, você estaria em conformidade com o DIP, pois a interface não dependeria de nenhuma classe concreta, apenas de abstrações.

Em uma aplicação direta de inversão de dependência, os resumos pertencem às camadas superior / política. Essa arquitetura agrupa os componentes superiores / de política e os resumos que definem serviços inferiores juntos no mesmo pacote. As camadas de nível inferior são criadas por herança / implementação dessas classes ou interfaces abstratas . Martin, Robert C. (2003).

  • Desenvolvimento Ágil de Software, Princípios,> Padrões e Práticas. Prentice Hall. 127-131. ISBN 978-0135974445.
Tulains Córdova
fonte
11
Não há muita diferença entre aceitar uma classe abstrata ou uma classe concreta (não final), e a diferença para uma interface não é muito mais que isso. Desde que a instância seja passada como parâmetro e não seja codificada em sua implementação, você terá as bases para o DI.
Jacob Raihle
@JacobRaihle O que você quer dizer com passar uma instância codificada na implementação?
Tulains Córdova
Eu disse "desde que seja aprovado e não codificado". O que quero dizer é que, como a Interfaceinterface aceita um CustomExceptione deixa que o chamador forneça um, o chamador é livre para fornecer qualquer classe que se estenda CustomExceptionmesmo que CustomExceptionseja uma classe concreta - o que não seria possível se Interfacefosse de alguma forma responsável pela criação isto. Essa inversão de controle, mais do que trabalhar com interfaces (embora isso certamente ajude), é sobre o que eu acho que DI.
Jacob Raihle
@JacobRaihle "Em uma aplicação direta de inversão de dependência, os resumos pertencem às camadas superior / política. Essa arquitetura agrupa os componentes superiores / política e os resumos que definem serviços inferiores juntos no mesmo pacote. As camadas de nível inferior são criadas por herança / implementação dessas classes ou interfaces abstratas ". Martin, Robert C. (2003). Desenvolvimento, princípios, padrões e práticas de software ágil. Prentice Hall. 127-131. ISBN 978-0135974445.
Tulains Córdova
Qual é o sentido de uma classe abstrata se você pode fornecer um padrão razoável? O que você perde ao fornecer isso? Não basta citar livros, pense.
Jacob Raihle
2

Tulains está certa - as interfaces dependem de classes concretas o tempo todo. Eles destinam-se apenas a criar um contrato para suas próprias preocupações. Esse contrato pode envolver a obtenção e o retorno de qualquer tipo de dados.

Lembre-se de que em linguagens de nível superior, mesmo os tipos primitivos não são tão primitivos. Então você está trabalhando com tipos concretos!

Sava B.
fonte
0

Suponho que pelo nome , você quer dizer a própria classe. Se você está tentando especificar o nome da classe de exceção real para inicializar a exceção correspondente por meio do Reflection, este não é o caminho certo a seguir.

Se você deseja usar uma classe personalizada em uma interface, é claro que pode usar suas próprias classes em suas próprias interfaces. As classes se tornam parte da interface pública da sua biblioteca / API. Estruturas de dados e exceções são um bom exemplo das classes que são frequentemente usadas pelas interfaces.

Se você precisar usar exceções diferentes, dependendo do contexto, poderá estar interessado em usar genéricos.

Arseni Mourzenko
fonte
Não, eu não quero dizer reflexão. Sim, como você mencionou. Exceções e estruturas de dados podem ser usadas em interfaces porque elas contêm dados e não são de plataforma ou dependem de outras classes. Obrigado.
Nikachx 23/10
2
Respostas que fazem as perguntas do OP ... Basta perguntar em um comentário e fornecer sua resposta.
Snoop
11
@ StevieV: O primeiro parágrafo foi mais uma pergunta retórica. E, como mostra o comentário do OP, na verdade respondi à pergunta do OP.
Arseni Mourzenko 23/10