Wie auf eine exception zu werfen enum-Konstruktor?
Wie kann ich eine exception werfen enum-Konstruktor? eg:
public enum RLoader {
INSTANCE;
private RLoader() throws IOException {
....
}
}
den Fehler erzeugt
Unhandled exception type IOException
- Warum wollen Sie das tun? Das klingt für mich wie ein Missbrauch des enum-Konzept. Enum-Werte werden sollen, Konstanten, deren Gründung nicht von etwas abhängig. Auch wenn technisch könnten Sie das (durch das werfen einer unchecked exception statt einer geprüft eine), würde ich vorschlagen, Sie Ihren Entwurf überarbeiten. Wenn Sie versuchen, zu implementieren eines Singleton über diese enum, es ist besser, es zu implementieren, mit der hand wie eine normale Klasse.
- Ich bin Implementierung eines Singleton, aber wie würde die Umsetzung es von hand, als eine normale Klasse besser sein? Ich würde immer noch eine Ausnahme von code durch einen statischen Initialisierer. Sie werfen können ungeprüfte Ausnahmen enum-Konstruktor.
- es ist etwas eklig zu bekommen, wird eine Ausnahme geworfen, nur durch den Zugriff auf einen enum-Wert. Nicht so schlimm, wenn es ein singleton getInstance () - Methode.
- Bitte keine singletons verwenden.
- Török, wie würde die Umsetzung es von hand, als eine normale Klasse besser sein? Ich denke, es ist ok zu verwenden enum implementiert ein singleton, als <Effektive Java - > sagte.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Weil Instanzen erstellt werden, die in einer statischen Initialisierer, werfen eine ExceptionInInitializerError statt.
Ich habe einen Fall wo ich will, zu verwenden Enumerationen, die als Schlüssel in einigen Einstellungen-Klassen. Die Datenbank speichert einen string-Wert, der es uns ermöglicht, ändern Sie die enum-Konstanten die zimmerreserviereung, ohne das udpate die Datenbank (ein bisschen hässlich, ich weiß). Ich wollte werfen eine exception zur Laufzeit, in der enum-Konstruktor als ein Weg, um der Polizei die Länge der string-argument zu vermeiden, auf die Datenbank und dann ein constraint-Verletzung, wenn ich könnte leicht entdecken es selbst.
Habe ich einen schnellen test für dieses, ich fand, dass die Ausnahme, die ausgelöst wurde, nicht von mir, sondern wurde in eine ExceptionInInitializerError.
Vielleicht ist das dumm, aber ich denke, es ist ein ziemlich gültiges Szenario für den Wunsch, eine Ausnahme in einem statischen Initialisierer.
Diesem Szenario nicht funktionieren kann.
Sie versuchen, werfen einen geprüften
Exception
aus dem Konstruktor.Dieser Konstruktor wird aufgerufen, durch den
INSTANCE
enum-Eintrag Erklärung, so überprüft die Ausnahme kann nicht richtig gehandhabt werden.Es ist auch meiner Meinung nach ist es schlechter Stil, Ausnahmen aus einem Konstruktor, wie ein Konstruktor, normalerweise sollte das nicht tun, keine Arbeit und vor allem nicht erstellen Fehler.
Auch, wenn Sie wollen, werfen Sie einen
IOException
ich gehe davon aus, das Sie initialisieren möchten etwas aus einer Datei, so sollten Sie vielleicht in Betracht ziehen Sie in diesem Artikel auf dynamische enums.