Java - Wie nur ein Objekt erstellen mit gültigen Parametern?
Mache ich einen grundlegenden Java-Kurs, und ich kam zu einem problem: Wie erstelle ich ein Objekt nur, wenn ich bestanden haben, die gültigen Parameter an den Konstruktor?
Sollte ich eine Alternative Klasse, und rufen Sie den Konstruktor von dort nach der Validierung realisiert wird?
Oder sollte/könnte ich eine statische Methode in der Klasse für die Validierung?
Was ist die beste Vorgehensweise in diesem Fall?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den standard der Praxis ist die überprüfung der Argumente im Konstruktor. Zum Beispiel:
Seite Hinweis: um zu überprüfen, dass Argumente, die nicht null sind, das ist ziemlich verbreitet, die Sie verwenden können:
UPDATE
Antworten auf Ihre spezifischen Kommentar über die social security number. Eine Möglichkeit wäre, fügen Sie eine Methode der Klasse:
Den aufrufenden code könnte dann so Aussehen:
Mit, dass der Entwurf, den Sie erreicht haben, zwei Dinge:
YourClass
missbraucht, wird eine exception ausgelöst und es wird Ihnen helfen zu erkennen, bugsKönnte man weiter gehen, indem Sie die Schaffung eines
SSN
Klasse, hält die SSN und kapselt die Logik zur Gültigkeitsprüfung.YourClass
würde dann annehmenSSN
- Objekt als argument, die ist immer eine gültige SSN durch den Bau.Ich würde nur werfen eine
IllegalArgumentException
im Konstruktor selbst:Einer bekannten Binsenweisheit in der Programmierung ist " Don 'T verwenden Sie Ausnahmen für flow control'. Ihr code sollte bewusst sein, die Einschränkungen und Wache gegen Sie vor dem Aufruf des Konstruktors eher als Umgang mit Fehlern. Ausnahmen bestehen für expectational Umstände, vor allem diejenigen, die vorhergesagt werden kann oder geschützt ist (z.B. eine IO-stream können ungültig werden, während des Schreibens, obwohl Sie OK während einer vorherigen Kontrolle).
Sie können zwar exceptions werfen, die in Ihrem Konstruktor, dies ist nicht immer ideal. Wenn Sie schreiben, öffentliche Objekte, die Sie erwarten, um verwendet werden/verwendet von anderen, Ausnahmen sind die einzige wirkliche option für die öffentlichen Bauherren, aber solche Einschränkungen und deren Ergebnis (z.B. welche exception wird geworfen) sollte klar dokumentiert werden, die in der javadoc für die Klasse.
Für interne Klassen, assertions sind besser geeignet. Als Oracle-Staaten: "Behauptungen... sollte verwendet werden, um zu überprüfen, für den Fall, dass sollte nie passieren, überprüfen Sie die Annahmen über Datenstrukturen oder die Durchsetzung von Einschränkungen, auf die Argumente der privaten Methoden."—Verwenden von Assertions in Java-Technologie. Sie sollten wahrscheinlich noch dokumentieren Sie Ihre Erwartungen für die Klasse, aber die Anwendung sollte intern tun alle Prüfungen im Vorfeld statt sich auf irgendwelche Exceptions geworfen.
Statische factory-Methoden können helfen, ein wenig, Ihre Vorteile sind der Ausarbeitung auf eine etwas andere Frage: Wie verwenden Sie Statische factory-Methoden statt Konstruktoren. Jedoch, Sie geben nicht stark Validierungs-Optionen, ohne, wieder, die sich auf Ausnahmen, wenn die Dinge sind nicht gültig (oder null zurückgeben, das ist weniger informativ).
Ihre ideale Lösung ist die Builder pattern. Nicht nur, dass es ermöglichen eine größere Flexibilität bei der Verwaltung Ihrer Argumente, können Sie überprüfen jedes einzeln, oder haben eine validate-Methode auswerten können alle Felder auf einmal. Ein Bauherr kann und sollte ausgeblendet werden, um das Objekt der eigentlichen Konstruktor, genießen Sie alleinigen Zugang zu und verhindert unerwünschte Werte aus, die jemals vorgelegt wurden, während Behauptungen können Schutz gegen 'die builder sollten nie behaupten, dass diese Werte".
Konstruktoren können exceptions werfen (siehe Können Konstruktoren werfen von Ausnahmen in Java?), so können Sie Ihren Konstruktor eine Ausnahme auslösen, wenn ungültige Werte übergeben werden. Sie können auch den Konstruktor private, und verwenden Sie die statische Methode das Objekt zu erstellen, und führt die Prüfungen durch. Dies könnte sauberer sein.
Einen Weg, um sicherzustellen, dass Sie über gültige Parameter an den Konstruktor übergeben wird erstellen Sie die übergeordnete Klasse mit Konstruktoren, die akzeptieren nur die Parameter, die Sie benötigen, dann erstellen Sie eine Unterklasse, die Ihre Benutzer verwenden. Wenn Sie zwingen Ihre Benutzer aufrufen super() auf und übergeben Sie Ihr Parameter erforderlich, dann haben Sie zumindest passieren in der richtigen Daten-Objekte. Soweit Sie gültige Werte für diesen Parameter, das ist bis zu Ihnen, ob Sie möchten enthalten die Validierung in den übergeordneten Konstruktor der Klasse werfen und runtime-exceptions oder ähnliches.
Hier ist ein Beispiel für die Oberklasse /Unterklasse Sache. Nennen wir die superlcass
SomeShape
und die UnterklasseTriangle
. Für alleSomeShape
Objekt, Sie zu zwingen, die "Benutzer", um eine Anzahl von Seiten und eine Seite der Länge. Dies ist, wie...Abgesehen von hard-Codierung eine Reihe von Logik-und exception werfen in Ihrem Konstruktor, das ist eine relativ saubere Art und Weise zu erzwingen, was Parameter sind erforderlich, um das Objekt zu erstellen.
Wenn Sie nicht wollen, um zu werfen eine exception aus dem Konstruktor, könnte man den Konstruktor private und erstellen Sie eine statische Methode liefert eine neue Instanz des Objekts oder null, wenn die Argumente ungültig sind. Der Aufrufer dieser Methode wäre zu prüfen, ob das Ergebnis null ist oder nicht, aber.
Beispiel:
Nutzung
Ist es schlechte Praxis, um eine exception zu werfen, aus einem Konstruktor. Sie am Ende mit einem teilweise initialisierten Objekt, das wahrscheinlich zu brechen alle Arten von Verträgen.
Wenn ein Konstruktor ist nicht gültig für alle Kombinationen von Produktionsfaktoren, es ist sauberer zum erstellen einer factory-Methode, die die Validierung und machen den Konstruktor privat. Wenn es eine Reale Möglichkeit des Scheiterns (das heißt, der Fehler ist nicht durch einen Fehler bei der Programmierung), dann könnte es angemessen sein, um eine
Optional
.