Java-Null-Argumente beim Verketten von Konstruktoren

8

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.

    
kalsowerus 29.07.2016, 09:42
quelle

5 Antworten

13

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:

%Vor%

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:

%Vor%     
Dici 29.07.2016, 09:46
quelle
8

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.

    
Jon Skeet 29.07.2016 09:46
quelle
3

Ein Textbuchtrick ist das Verschieben der Initialisierung aus dem Konstruktor in eine Methode. Dann können Sie den gewünschten Code davor haben:

%Vor%     
Mureinik 29.07.2016 09:47
quelle
2

Wenn Sie wirklich ein IllegalArgumentException ausgeben wollen, ist die sauberste Lösung, eine statische Methode anstelle eines Konstruktors zu verwenden:

%Vor%

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.

    
overactor 29.07.2016 10:12
quelle
1

Das kannst du so machen

%Vor%     
D. Cosentino 29.07.2016 09:55
quelle