Die Antwort auf diese Frage finden Sie in The Java® Sprachspezifikation
Eine Assertion ist eine assert-Anweisung, die einen booleschen Ausdruck enthält. Eine Assertion ist entweder aktiviert oder deaktiviert. Wenn die Assertion aktiviert ist, führt die Ausführung der Assertion zur Auswertung des booleschen Ausdrucks und ein Fehler wird gemeldet, wenn der Ausdruck als false ausgewertet wird. Wenn die Assertion deaktiviert ist, hat die Ausführung der Assertion keinerlei Auswirkungen.
Also, wenn assert
eine Methode wäre, dann so ein Code:
ruft immer die Methode check
auf, unabhängig davon , ob die Assertion aktiviert oder deaktiviert ist.
Nun, da assert
ein Schlüsselwort mit einer speziellen Behandlung ist (wie oben beschrieben), wird die Methode check
nur aufgerufen, wenn die Assertion nur als der boolesche Ausdruck dieser Option aktiviert ist assert wird ausgewertet.
Java-Assertions können ohne Änderungen am Code ein- und ausgeschaltet werden. Auf diese Weise kann der Laufzeitaufwand für Assertionen in der Produktion vermieden werden, während der Debugging-Wert in Entwicklungsumgebungen genutzt wird.
Assertionen, die als Methodenaufrufe im Anwendungscode implementiert werden, würden nicht so gut funktionieren. Selbst wenn das Verfahren für jede Umgebung wie gewünscht kurzgeschlossen werden kann, werden Zyklen immer durch den Methodenaufruf und den Test verbrannt, um festzustellen, ob es aktiv ist oder nicht.
In der Praxis ist das Java-assert-Schlüsselwort nicht populär, zumindest nicht zu diesem Zeitpunkt. Assertionen werden in JUnit-Tests weit häufiger implementiert, wie andere Poster angesprochen haben. In der JUnit-Welt sind Assertions Methodenaufrufe . Sie verursachen keinen Overhead in der Produktion, da sie nicht im Hauptcode enthalten sind. Sie befinden sich in einem separaten Testcode, der nur in Entwicklungsumgebungen ausgeführt wird.
Ein möglicher Grund ist, dass Assertions aktiviert oder deaktiviert werden können - dies ist besser in Java (einer Sprache ohne Präprozessor) mit einem Schlüsselwort als mit einer Methode modelliert, da die Annahme bei einer Methode darin besteht, dass der Code immer ausgeführt wird ( obwohl es möglich wäre, den Compiler dazu zu bringen, die Methodenaufrufe zu entfernen, wenn Assertionen deaktiviert waren.)
Vergleiche dies mit Behauptungen in z.B. C oder C ++, wo Sie einen Präprozessor haben - in diesem Fall reicht es aus, die Assertionen basierend darauf, ob ein bestimmtes Präprozessor-Flag definiert ist, vorzuverarbeiten.