Die Idee ist, schnell zu scheitern. Betrachten Sie zum Beispiel diese dumme Klasse:
public class Foo {
private final String s;
public Foo(String s) {
this.s = s;
}
public int getStringLength() {
return s.length();
}
}
Angenommen, Sie möchten keine Nullwerte für zulassen s
. (oder getStringLength
wirft eine NPE). Wenn die Klasse so ist wie sie ist, null
ist es zu spät - es ist sehr schwer herauszufinden, wer sie dort abgelegt hat. Der Täter könnte durchaus in einer völlig anderen Klasse sein, und diese Foo
Instanz könnte vor langer Zeit konstruiert worden sein. Jetzt müssen Sie Ihre Codebasis durchkämmen, um herauszufinden, wer dort möglicherweise einen null
Wert hätte setzen können.
Stellen Sie sich stattdessen diesen Konstruktor vor:
public Foo(String s) {
this.s = checkNotNull(s);
}
Wenn jemand dort einen Eintrag einfügt null
, werden Sie es sofort herausfinden - und der Stack-Trace zeigt Sie genau auf den fehlgeschlagenen Aufruf.
Ein anderes Mal kann dies nützlich sein, wenn Sie die Argumente überprüfen möchten, bevor Sie Aktionen ausführen, mit denen der Status geändert werden kann. Betrachten Sie beispielsweise diese Klasse, die den Durchschnitt aller erhaltenen Zeichenfolgenlängen berechnet:
public class StringLengthAverager {
private int stringsSeen;
private int totalLengthSeen;
public void accept(String s) {
stringsSeen++;
totalLengthSeen += s.length();
}
public double getAverageLength() {
return ((double)totalLengthSeen) / stringsSeen;
}
}
Beim Aufrufen accept(null)
wird eine NPE ausgelöst - jedoch nicht zuvor stringsSeen
. Dies ist möglicherweise nicht das, was Sie wollen. Als Benutzer der Klasse kann ich erwarten, dass der Status unverändert bleibt, wenn keine Nullen akzeptiert werden, wenn Sie eine Null übergeben (mit anderen Worten: Der Aufruf sollte fehlschlagen, das Objekt jedoch nicht ungültig werden). In diesem Beispiel können Sie das Problem natürlich auch beheben, indem Sie es s.length()
vor dem Inkrementieren abrufen stringsSeen
. Sie können jedoch sehen, dass es für eine längere und aufwändigere Methode hilfreich sein kann, zunächst zu überprüfen, ob alle Ihre Argumente gültig sind, und erst dann den Status zu ändern:
public void accept(String s) {
checkNotNull(s);
stringsSeen++;
totalLengthSeen += s.length();
}