Design by Contract, von Meyer für die Programmiersprache Eiffel vorgeschlagen, ist eine Technik, die Laufzeitprüfungen von Spezifikationsverletzungen und deren Behandlung während der Programmausführung ermöglicht. Jass, Java mit Behauptungen, ist eine Design by Contract Erweiterung für Java, die es erlaubt, Java-Programme mit Spezifikationen in Form von Behauptungen zu kommentieren. Das Jass-Tool ist ein Pre-Compiler, der in reine Java-Programme übersetzt, in denen die Einhaltung der Spezifikation dynamisch getestet wird. Neben den aus der klassischen Programmverifizierung bekannten Standard-Design by Contract-Features (z.B. Vor- und Nachkonditionen, Invarianten) unterstützt Jass zusätzlich Verfeinerung, d.h. Untertypisierung, Kontrollen und das neuartige Konzept von Spurenbehauptungen. Trace-Assertionen werden verwendet, um das dynamische Verhalten von Objekten in der Zeit zu überwachen. Wenn wir Instanzen der Team-Klasse als HashMap-Schlüssel verwenden möchten, müssen wir die hashCode()-Methode überschreiben, damit sie dem Vertrag entspricht: Equal-Objekte geben denselben hashCode zurück. Die zweiten Kriterien des hashCode-Methodenvertrages haben eine wichtige Konsequenz: Wenn wir equals(überschreiben), müssen wir auch hashCode() überschreiben. Und dies ist bei weitem die weit verbreitete Verletzung in Bezug auf die Verträge der equals() und hashCode() Methoden. Es wird dringend empfohlen (wenn auch nicht erforderlich), dass natürliche Ordnungen mit gleichen übereinstimmen. Dies liegt daran, dass sich sortierte Sätze (und sortierte Karten) ohne explizite Vergleicher “seltsam” verhalten, wenn sie mit Elementen (oder Schlüsseln) verwendet werden, deren natürliche Reihenfolge mit Gleichgestellten unvereinbar ist. Insbesondere verstößt ein solcher sortierter Satz (oder eine sortierte Karte) gegen den allgemeinen Vertrag für Satz (oder Karte), der in Bezug auf die Equal-Methode definiert ist.

Char-Sequenzen und Zeichenfolgen haben zusätzlich eine ifBlank-Erweiterung, die dasselbe wie ifEmpty ausführt, aber überprüft, ob eine Zeichenfolge alle Leerzeichen statt leer ist. Aber warum ist die Vertragsverletzung in unserer Teamklasse ein Problem? Nun, das Problem beginnt, wenn einige Hash-basierte Sammlungen beteiligt sind. Lassen Sie uns versuchen, unsere Team-Klasse als Schlüssel einer HashMap zu verwenden: Und jetzt funktioniert Gleichberechtigung symmetrisch, wie es der Vertrag erfordert. Java Developer – Finanzdienstleistungen – Tagesgeldvertrag – Belfast – Großbritannien – 12 … Dies ist ein anfänglicher 12-Monats-Vertrag mit dem Potenzial zu verlängern. Die erfolgreiche … Um das Verhalten in solchen Fällen zu verbessern, führt Kotlin 1.3 experimentelle Mechanismen ein, die als Verträge bezeichnet werden. isNullOrEmpty- und orEmpty-Erweiterungen für einige Typen sind bereits in stdlib vorhanden.

Die erste gibt true zurück, wenn der Empfänger null oder leer ist, und die zweite wird auf eine leere Instanz zurückgesetzt, wenn der Empfänger null ist. Kotlin 1.3 bietet ähnliche Erweiterungen für Auflistungen, Karten und Arrays von Objekten. Es ist möglich, Verträge für Ihre eigenen Funktionen zu deklarieren, aber diese Funktion ist experimentell, da sich die aktuelle Syntax in einem Frühen Prototyp befindet und höchstwahrscheinlich geändert wird. Bitte beachten Sie auch, dass der Kotlin-Compiler derzeit keine Verträge überprüft, so dass es die Verantwortung eines Programmierers ist, korrekte und solide Verträge zu schreiben. Es ist wichtig zu erkennen, dass die Standardkonfiguration von EqualsVerifier nur unveränderliche Felder zulässt. Dies ist eine strengere Prüfung als das, was der Java SE-Vertrag zulässt. Dies entspricht einer Empfehlung des domänengesteuerten Entwurfs, um Wertobjekte unveränderlich zu machen. Alle drei Kriterien im Vertrag von hashCode() erwähnen in gewisser Weise die Equals()-Methode: stdlib nutzt bereits Verträge, was zu Verbesserungen in den oben beschriebenen Analysen führt. Dieser Teil der Verträge ist stabil, so dass Sie von der verbesserten Analyse sofort ohne zusätzliche Opt-Ins profitieren können: Kotlin 1.3 führt Unterstützung für runnable Kotlin Scratch-Dateien ein.