Ich erstelle eine Schnittstelle in Java für die benutzerdefinierte Fehlerbehandlung.
Ich möchte ein Argumentfehlerobjekt übergeben, aber ich brauche es, um ein Kind der Exception
Klasse zu sein.
Ist es in Ordnung, meinen definierten Klassennamen in einer Schnittstelle zu verwenden?
Wird es nicht weniger zu einer Schnittstelle, da es nicht von einer Implementierung abhängig ist?
Ich versuche so etwas zu tun:
public class CustomException {
/* ... Implementation ... */
}
public interface Interface {
void onError(CustomException ex);
}
java
design
object-oriented
interfaces
Nikachx
quelle
quelle
CustomException
Teil der Implementierung oder ein Teil der Schnittstelle?String
sicherer alsCustomException
? Warum ist es wichtig, wennCustomException
wiederum andere Abhängigkeiten bestehen?Antworten:
Zuerst muss ich darauf hinweisen, dass sich
CustomException
das nicht ausdehnt,Exception
so dass es nicht wirklich ein istException
.Das gesagt:
Wenn Sie sich nicht für das Prinzip der Abhängigkeitsinversion interessieren , lassen Sie es so, wie es ist. Es ist vollkommen in Ordnung, wenn eine Schnittstelle von konkreten Klassen abhängt.
String
Object
Beispielsweise hängen viele Schnittstellen von konkreten Klassen ab oder sind konkrete Klassen . Die Sache ist, dass wir eher glauben würden, dass Klassen, die zum Java SDK gehören, stabiler sind (weniger anfällig für Änderungen, die den Code brechen) als die, die wir schreiben.In der anderen Hand:
Wenn Sie dem DIP folgen möchten (das unzählige Vorteile hat und meine Empfehlung ist), müssen Sie eines von zwei Dingen tun:
Option 1
CustomException
abstraktvoid onError(CustomException ex)
wie es istOption 2
CustomException
eine Schnittstellevoid onError(CustomException ex)
wie es istMit einer dieser Optionen würden Sie dem DIP entsprechen, da die Schnittstelle nicht von einer konkreten Klasse abhängen würde, sondern nur von Abstraktionen.
quelle
Interface
Schnittstelle a akzeptiertCustomException
und es dem Aufrufer überlässt, eine bereitzustellen, kann der Anrufer jede Klasse bereitstellen, die sich erweitert,CustomException
selbst wennCustomException
es sich um eine konkrete Klasse handelt - was nicht möglich gewesen wäre, wennInterface
es irgendwie für das Erstellen verantwortlich gewesen wäre es. Diese Umkehrung der Kontrolle, mehr als die Arbeit mit Schnittstellen (obwohl das sicherlich hilft), ist meiner Meinung nach das, worum es bei DI geht.Tulains hat recht - Schnittstellen hängen ständig von konkreten Klassen ab. Sie sollen nur einen Vertrag für ihre eigenen Anliegen erstellen. Dieser Vertrag kann die Aufnahme und Rückgabe jeglicher Art von Daten beinhalten.
Denken Sie daran, dass in höheren Sprachen selbst primitive Typen nicht so primitiv sind. Sie arbeiten also sowieso mit konkreten Typen!
quelle
Ich nehme an, mit Namen meinen Sie die eigentliche Klasse. Wenn Sie versuchen, den tatsächlichen Namen der Ausnahmeklasse anzugeben , um die entsprechende Ausnahme über Reflection zu initialisieren, ist dies nicht der richtige Weg.
Wenn Sie eine benutzerdefinierte Klasse in einer Schnittstelle verwenden möchten, können Sie natürlich Ihre eigenen Klassen in Ihren eigenen Schnittstellen verwenden. Die Klassen werden Teil der öffentlichen Schnittstelle Ihrer Bibliothek / API. Datenstrukturen und Ausnahmen sind ein gutes Beispiel für die Klassen, die häufig von den Schnittstellen verwendet werden.
Wenn Sie je nach Kontext unterschiedliche Ausnahmen verwenden müssen, sind Sie möglicherweise an der Verwendung von Generika interessiert.
quelle