Vererbung Enum Vererbung/Polymorphie

Mithotyn

Mitglied
Hallo zusammen!

Folgende Codestücke vorneweg:

Java:
// Meine Basis Exception
class ExceptionBasis extends Exception {
    // Inhalt hier nicht wichtig
}

Java:
// Enum mit speziellen Codes für Exception A, die einen String als Parameter enthalten
enum ACodes {
    A1("Bla"), A2("Blubb");

    public String getParameter() {
        return parameter;
    }
}

class ExceptionA extends ExceptionBasis {
    private ACodes aCodes;
    
    public ACodes getCode() {
        return aCodes;
    }
}

Java:
// Enum mit speziellen Codes für Exception B, die einen String als Parameter enthalten
enum BCodes {
    B1("Foo"), B2("Bar");

    public String getParameter() {
        return parameter;
    }
}

class ExceptionB extends ExceptionBasis {
    private BCodes bCodes;
    
    public BCodes getCode() {
        return bCodes;
    }
}

Sodele. Nun hab ich den Fall, dass eine Methode beide Exceptions werfen kann. Ich will aber so abstrakt und generisch wie möglich programmieren und hier stoße ich an Grenzen.

Java:
try {
   // Methode die entweder ExceptionA oder ExceptionB werfen kann
    doSomething();
} catch(ExceptionBasis e) {
    String parameter;

    if (e instanceof ExceptionA) {
        parameter = (ExceptionA e).getCode().getParameter();
    } elseif (e instanceof ExceptionB) {
        parameter = (ExceptionB e).getCode().getParameter();
    }

    // Hier steht dann entweder "Bla", "Blubb", "Foo" oder "Bar"
    System.out.println(parameter);
}

Mit catch kann ich ja anstelle von ExceptionA und ExceptionB einfach die Basisklasse ExceptionBasis abfangen. Aber um an den Parameter zu kommen, muss ich die BasisException trotzdem casten, nur um dann die gleichlautenden getCode() und getParameter() Methoden aufzurufen, die ich aber pro Enum-Typ einzeln ausprogrammieren muss.

Da Enums von sich aus weder erben können, noch polymorph verwendet werden können, wie kann ich obigen Code einfacher gestalten?

Gruß Joachim
 
Da Enums von sich aus weder erben können, noch polymorph verwendet werden können, wie kann ich obigen Code einfacher gestalten?
vielleicht ist das bsp auch nur schlecht gewählt, aber es macht so keinen Sinn.

Warum gibt es 2 versch. Enums ? Warum gibt es 2 versch. Execptionimplementierungen von ExceptionBasis ?

Sie unterscheiden sich kein bisschen voneinander....

Warum überhaupt Enums wenn sie nur "Parameter" vom Typ String haben ?

Wies einfacher geht ?

Java:
// Meine Basis Exception
class ExceptionBasis extends RunetimeException {
    private String parameter;
   // und so weiter
}

Generisch hin oder her, aber das ist zuviel und somit mehr hinderlich als förderlich. Keine Probleme jetzt schon angehen, die es noch gar nicht gibt.

Aber wie gesagt - vll ist das bsp nur schlecht gewählt
 
Hi!

Danke für die schnelle Antwort!

Das Beispiel ist natürlich vereinfacht:

Zwei Implementierungen gibt es, weil sie in unterschiedlichen Packages definiert werden und für unterschiedliche Zwecke dienen.
A wird im Package "Cache" benutzt, B im Package "Schnittstelle". Beide Packages haben bis auf die ExceptionBase keine Abhängigkeiten zueinander.

Die genannte Methode holt über die Schnittstelle Daten und legt sie im Cache ab. Deswegen kann sie A und B werfen.

Die Codes haben nicht nur den String-Parameter, sondern noch weitere Infos, die dann zur Bearbeitung der Exception benötigt werden. Diese sind halt je nach Package völlig unterschiedlich.

Als Enum ist es deshalb definiert, damit der Programmierer nicht willkürliche Strings nutzen kann, sondern nur die Codes, die auch als Enum-Konstante definiert sind.

Konkret könnte im Schnittstellen-Package folgende Exception geworfen werden:

Java:
throw new BackendException(BackendExceptionCode.BACKEND_NOT_AVAILABLE);

Das ist für den Entwickler der die Exception wirft sehr komfortabel einfach. Auf der Catch-Seite kann der Entwickler dann aus der Enum-Konstante auslesen, was er mit der Exception machen soll. Hier z.B. nen kritischen Fehler auslösen und die Anwendung herunterfahren.

Da es ziemlich viele dieser Codes gibt (ist ein sehr umfangreiches System), will ich nicht dutzende einzelner Exceptions definieren.

Jetzt klarer?

Danke und Gruß Joachim
 

Zurück
Oben