Je crée une interface en Java pour le gestionnaire d'erreurs personnalisé.
Je veux passer un objet d'erreur d'argument mais j'en ai besoin pour être un enfant de Exception
classe.
Est-il correct d'utiliser mon nom de classe défini dans une interface?
Cela n'en fera-t-il pas moins une interface en termes de ne dépendre d'aucune implémentation?
J'essaie de faire quelque chose comme ça:
public class CustomException {
/* ... Implementation ... */
}
public interface Interface {
void onError(CustomException ex);
}
java
design
object-oriented
interfaces
nikachx
la source
la source
CustomException
partie de l'implémentation ou fait partie de l'interface?String
plus sûr queCustomException
? Pourquoi est-ce important siCustomException
, à son tour, a d'autres dépendances?Réponses:
Tout d' abord , je dois souligner le fait que
CustomException
ne couvre pasException
il est pas vraiment unException
.Cela dit:
Si vous ne vous souciez pas du principe d'inversion de dépendance , laissez-le tel quel. Il est parfaitement normal qu'une interface dépende de classes concrètes, par exemple de nombreuses interfaces dépendent
String
ouObject
qui sont des classes concrètes . Le fait est que nous aurions tendance à croire que les classes qui appartiennent au SDK Java sont plus stables (moins sujettes aux changements de rupture de code) que celles que nous écrivons.D'un autre coté:
Si vous souhaitez suivre le DIP (qui a d'innombrables avantages et est ma recommandation), vous devez faire l'une des deux choses suivantes:
Option 1
CustomException
résumévoid onError(CustomException ex)
tel quelOption 2
CustomException
une interfacevoid onError(CustomException ex)
tel quelAvec l'une ou l'autre de ces options, vous seriez conforme au DIP, car l'interface ne dépendrait d'aucune classe concrète, seulement d'abstractions.
la source
Interface
interface accepte unCustomException
et laisse à l'appelant le soin d'en fournir un, l'appelant est libre de fournir n'importe quelle classe qui s'étendCustomException
même s'ilCustomException
s'agit d'une classe concrète - ce qui n'aurait pas été possible s'ilInterface
était en quelque sorte responsable de la création il. Cette inversion de contrôle, plus que de travailler avec des interfaces (bien que cela aide certainement), est ce que je pense que DI est tout.Tulains a raison - les interfaces dépendent tout le temps de classes concrètes. Ils sont uniquement destinés à créer un contrat pour leurs propres préoccupations. Ce contrat peut impliquer la prise et le retour de tout type de données.
N'oubliez pas que dans les langues de niveau supérieur, même les types primitifs ne le sont pas. Vous travaillez donc avec des types de béton de toute façon!
la source
Je suppose que par nom , vous voulez dire la classe elle-même. Si vous essayez de spécifier le nom de la classe d'exception réelle afin d'initialiser l'exception correspondante via Reflection, ce n'est pas la bonne solution.
Si vous souhaitez utiliser une classe personnalisée dans une interface, vous pouvez bien sûr utiliser vos propres classes dans vos propres interfaces. Les classes deviennent des parties de l'interface publique de votre bibliothèque / API. Les structures de données et les exceptions sont un bon exemple des classes qui sont souvent utilisées par les interfaces.
Si vous devez utiliser différentes exceptions en fonction du contexte, vous pouvez être intéressé par l'utilisation de génériques.
la source