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 Exception
classe.
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);
}
java
design
object-oriented
interfaces
nikachx
fonte
fonte
CustomException
parte da implementação ou parte da interface?String
mais seguro do queCustomException
? Por que importa seCustomException
, por sua vez, tem outras dependências?Respostas:
Primeiro eu tenho que apontar o fato de que
CustomException
não se estende,Exception
então não é realmente umException
.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
String
ouObject
sã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
CustomException
resumovoid onError(CustomException ex)
como estáopção 2
CustomException
uma interfacevoid 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.
fonte
Interface
interface aceita umCustomException
e deixa que o chamador forneça um, o chamador é livre para fornecer qualquer classe que se estendaCustomException
mesmo queCustomException
seja uma classe concreta - o que não seria possível seInterface
fosse 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.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!
fonte
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.
fonte