Nehmen wir an, ich habe eine Klasse mit mehreren Konstruktoren, von denen einer ein Kopierkonstruktor ist (um ein Objekt zu kopieren):
%Vor% Gibt es eine Möglichkeit, dass ich überprüfen kann, ob source
null
im Copy-Konstruktor ist und eine IllegalArgumentException
, wenn es ist? Weil der andere Konstruktor aufruft, um die erste Anweisung in meinem Konstruktor zu sein.
Sie können dies tun:
%Vor% Ich stimme auch Jon Skeet zu, dass ein NullPointerException
in diesem Fall kein schlechter Fall ist. Die einzige Sache ist, dass in langen Zeilen, wenn Sie eine NPE erhalten, es ein bisschen schwierig sein kann zu identifizieren, welches Objekt null
ist, weshalb eine spezifischere Nachricht nützlich sein kann.
Sie können das Rad auch nicht neu erfinden und verwenden Sie die Standardmethode java.util.Objects
, wenn Sie nicht stattdessen ein NullPointerException
werfen möchten:
Wenn Ihre Fehlermeldung teuer zu bauen ist, können Sie stattdessen einen Supplier<String>
angeben, um die Kosten für den Aufbau der Nachricht nur dann zu übernehmen, wenn sie tatsächlich benötigt wird:
Ja, Sie können eine Hilfsmethode verwenden, die die Ausnahme bei Bedarf auslöst und den ursprünglichen Wert zurückgibt, andernfalls ... Sie können dies innerhalb Ihres Konstruktoraufrufs aufrufen, da Sie Methodenaufrufe als Teil der Argumentauswertung zulassen.
%Vor%Dann verwenden Sie es als:
%Vor% Allerdings ... Ich glaube, dass NullPointerException
die empfohlene Ausnahme ist, um hier trotzdem zu werfen (in Effective Java 2nd edition, zum Beispiel), die dein vorhandener Code schon werfen wird. Möglicherweise möchten Sie also Ihren bestehenden Code nicht ändern.
Wenn Sie eine Hilfsmethode für solche Überprüfungen wünschen, die aber gerne NullPointerException
auslösen, empfehle ich die Verwendung von Guava und dessen Vorbedingungen Klasse, die diese und eine Menge anderer hilfreicher Prüfmethoden enthält.
Beachten Sie auch, dass Java 1.7 java.util.Objects
eingeführt hat requireNonNull
, so dass Sie nicht einmal eine Drittanbieterbibliothek benötigen.
Wenn Sie wirklich ein IllegalArgumentException
ausgeben wollen, ist die sauberste Lösung, eine statische Methode anstelle eines Konstruktors zu verwenden:
Oder Sie könnten einfach eine Kopiermethode hinzufügen:
%Vor%Ich würde das letztere bevorzugen, da es die Notwendigkeit beseitigt, sich damit zu befassen, dass das Rechteck möglicherweise null ist. Beachten Sie, dass dies eine NPE verursacht, wenn Sie diese mit einem Null-Objekt verwenden, was möglicherweise ein weiterer Hinweis darauf ist, dass ein NPE in Ordnung ist.
Tags und Links java constructor copy-constructor