Ist es eine gute Übung, dass der Konstruktor eine Ausnahme auslöst?
Ist es eine gute Praxis, der Konstruktor eine exception werfen?
Zum Beispiel habe ich eine Klasse Person
und ich habe age
als sein einziges Attribut. Jetzt
Ich Stelle die Klasse als
class Person{
int age;
Person(int age) throws Exception{
if (age<0)
throw new Exception("invalid age");
this.age = age;
}
public void setAge(int age) throws Exception{
if (age<0)
throw new Exception("invalid age");
this.age = age;
}
}
InformationsquelleAutor der Frage ako | 2011-05-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Auslösen von Ausnahmen im Konstruktor ist nicht eine schlechte Praxis. In der Tat, es ist die nur angemessenen Weg für einen Konstruktor, um anzuzeigen, dass es ein problem gibt; z.B., dass die Parameter ungültig sind.
Jedoch ausdrücklich erklärt oder werfen
java.lang.Exception
ist fast immer eine schlechte Praxis.Sollten Sie wählen Sie eine exception-Klasse, entspricht der außergewöhnlichen Bedingung, dass eingetreten ist. Wenn Sie werfen
Exception
es ist schwierig, für den Anrufer zu trennen, diese Ausnahme aus einer beliebigen Anzahl von anderen möglichen deklarierten und nicht deklarierten Ausnahmen. Dies macht die Fehlerbehebung schwierig, und wenn der Anrufer wählt, um zu verbreiten, sind die Ausnahme, eben das problem breitet sich aus.Jemand schlug die Verwendung
assert
für die überprüfung der Argumente. Das problem dabei ist, dass die überprüfung derassert
Behauptungen können ein-und ausgeschaltet werden über einen JVM-Befehlszeile festlegen. Mit Behauptungen zu überprüfen, interne Invarianten ist OK, aber mit Ihnen zu implementieren, die eine überprüfung der Argumente, die in Ihr angegebene javadoc ist keine gute Idee ... weil es bedeutet, dass Ihre Methode wird nur streng Umsetzung der Spezifikation bei der assertion-Prüfung ist aktiviert.Das zweite problem mit
assert
ist, dass, wenn eine assertion fehlschlägt, dannAssertionError
geworfen wird, und die empfangene Weisheit ist, dass es ein schlechte Ideeum zu versuchen zu fangenError
- und Untertyps.InformationsquelleAutor der Antwort Stephen C
Habe ich immer als werfen checked exceptions im Konstruktor schlechte Praxis, oder zumindest etwas, das vermieden werden sollte.
Der Grund dafür ist, dass Sie dies nicht tun :
Stattdessen müssen Sie dies tun :
An dem Punkt, wenn ich den Bau SomeObject ich weiß, was es ist-Parameter sind
also warum sollte mir erwartet, dass ich wickeln Sie es in ein try-catch?
Ahh Sie sagen, aber wenn ich Baue ein Objekt aus der dynamischen Parameter ich weiß nicht, ob Sie gültig sind oder nicht.
Gut, man könnte... überprüfen Sie die Parameter vor der übergabe an den Konstruktor. Das wäre eine gute Praxis.
Und wenn Sie besorgt sind, ob die Parameter gültig sind, dann können Sie IllegalArgumentException.
Also, anstatt werfen checked exceptions nur tun
Natürlich gibt es Fälle, in denen es könnte nur sinnvoll sein, werfen einer checked exception
Aber wie oft ist das wahrscheinlich?
InformationsquelleAutor der Antwort Richard
Wie bereits in eine andere Antwort hierdie in Richtlinie 7-3 der Java Secure Coding Richtliniendas werfen einer exception im Konstruktor einer nicht-finalen Klasse öffnet sich ein potenzieller Angriffsvektor:
InformationsquelleAutor der Antwort Hazok
Brauchen Sie nicht zu werfen, eine checked exception. Dies ist ein Fehler innerhalb der Steuerung des Programms, so dass Sie wollen, um zu werfen eine ungeprüfte Ausnahme. Verwenden Sie eine der ungeprüften Ausnahmen, die schon durch die Java-Sprache, wie
IllegalArgumentException
IllegalStateException
oderNullPointerException
.Können Sie auch wollen, um loszuwerden, der setter. Sie haben bereits einen Weg zu initiieren
age
durch den Konstruktor. Muss es aktualisiert werden, sobald instanziiert? Wenn nicht, überspringen Sie die setter. Eine gute Regel, nicht die Dinge machen, mehr öffentlichkeit als notwendig. Starten Sie mit privaten oder Standard, und sichern Sie Ihre Daten mitfinal
. Jetzt weiß jeder, dassPerson
wurde richtig aufgebaut, und ist unveränderlich. Es kann mit zuversicht verwendet werden.Wahrscheinlich dies ist, was Sie wirklich brauchen:
InformationsquelleAutor der Antwort Spam Suppper
Es ist eine schlechte Praxis zu werfen, Ausnahme, als, das erfordert, dass jemand, der ruft den Konstruktor zu fangen Ausnahme, das ist eine schlechte Praxis.
Ist es eine gute Idee zu haben, einen Konstruktor (oder einer beliebigen Methode) werfen eine Ausnahme, generell IllegalArgumentException, die deaktiviert ist, und damit der compiler nicht zwingen, Sie zu fangen.
Sollten Sie werfen überprüfte Ausnahmen (Dinge, die sich von Exception, aber nicht von RuntimeException), wenn Sie möchten, dass der Anrufer zu fangen.
InformationsquelleAutor der Antwort TofuBeer
Habe ich nie in Betracht gezogen, dass es eine schlechte Praxis zu werfen einer exception im Konstruktor. Wenn die Klasse ist so konzipiert, haben Sie eine bestimmte Idee im Kopf haben, was die Struktur für die Klasse sein sollte. Wenn jemand anderes hat eine andere Idee und Ausführung versucht, die Idee, dann sollten Sie die Fehler entsprechend, sodass der Benutzer ein feedback auf das, was der Fehler ist. In Ihrem Fall, sollten Sie überlegen, etwas wie
wo
NegativeAgeException
ist eine Ausnahme-Klasse, die Sie konstruiert sich selbst, möglicherweise auch der Ausweitung eine weitere Ausnahme wieIndexOutOfBoundsException
oder etwas ähnliches.Behauptungen nicht genau zu sein scheinen dem Weg zu gehen, entweder, weil Sie nicht versuchen, entdecken Sie Fehler in Ihrem code. Ich würde sagen, beenden mit einer Ausnahme das absolut richtige, was hier zu tun.
InformationsquelleAutor der Antwort ashays
Dies ist völlig gültig, ich mache es die ganze Zeit. Normalerweise verwende ich IllegalArguemntException wenn es ein Ergebnis der parameter überprüfen.
In diesem Fall würde ich nicht vorschlagen, behauptet, weil Sie ausgeschaltet sind, in einer Bereitstellung erstellen, und Sie wollen immer, um dies zu verhindern, aber deine sind gültig, wenn Ihre Gruppe hat ALLE Tests mit behauptet eingeschaltet ist, und Sie denken, dass die chance fehlt ein parameter-problem zur Laufzeit, akzeptabler als eine Ausnahme zu werfen, ist vielleicht eher die Ursache für runtime-crash.
Auch ein assert wäre schwieriger für den Aufrufer auffangen, das ist einfach.
Als "Würfe" in Ihrer Methode in javadocs.
InformationsquelleAutor der Antwort Bill K
Ich bin nicht für das werfen der Exceptions im Konstruktor, da ich mir überlege diese als nicht sauber. Es gibt mehrere Gründe für meine Meinung.
Als Richard erwähnt, können Sie Sie nicht initialisieren einer Instanz in einer einfachen Art und Weise. Vor allem in Prüfungen ist es echt nervig zum bauen einer test-wide-Objekt, nur um es in eine try-catch-während der Initialisierung.
Konstruktoren werden sollten, Logik-kostenlos. Es gibt überhaupt keinen Grund zum Kapseln von Logik in einem Konstruktor, da Sie immer mit dem Ziel für die Trennung von Bedenken, und das Prinzip der Einzigen Verantwortung. Denn die Sorge der Konstruktor ist zu "konstruieren Sie ein Objekt" sollte es nicht Kapseln jede exception-handling, wenn man sich nach diesem Ansatz.
Es riecht nach schlechtem design. Imho, wenn ich gezwungen bin zu tun, exception-handling, in der Konstruktor-ich bin bei der ersten Frage mich, ob ich irgendwelche design-Betrüger, die in meine Klasse. Es ist manchmal notwendig, aber dann habe ich die Auslagerung dieses zu einem generator oder in der Fabrik zu halten, den Konstruktor so einfach wie möglich.
So, wenn es notwendig ist, um einige der Ausnahmebehandlung in den Konstruktor, warum sollte man nicht auslagern, diese Logik zu einem generator der Fabrik? Es könnte noch ein paar Zeilen mehr im code, sondern gibt Ihnen die Freiheit, zu implementieren, die eine weit mehr robust und gut geeignet, exception-handling, da kann man auslagern der Logik für die Ausnahmebehandlung noch mehr und sind nicht geklebt, die an den Konstruktor, die Kapseln zu viel Logik. Und der client muss nicht wissen, etwas über Ihre Konstruktion die Logik, wenn Sie delegieren die Ausnahmebehandlung richtig.
InformationsquelleAutor der Antwort Vegaaaa