2016-03-29 8 views
3

Ich möchte zwei Erweiterungsfunktionen zu ResultSet hinzufügen, die einen Wert als LocalDate erhält.Kotlin- Erweiterungsfunktionen und Plattformtypen?

fun ResultSet.getLocalDate(colName: String) = getDate(colName)?.toLocalDate() 
fun ResultSet.getLocalDate(colIndex: Int) = getDate(colIndex)?.toLocalDate() 

Das Problem ist getDate() ein Date! zurückgibt, und offensichtlich einen Null-Fehler ohne ?. Anruf konnte ich vor toLocalDate() bekommen. Aber dann muss jeder, der diese Erweiterung verwendet, das Ergebnis als LocalDate? und nicht als LocalDate! verwenden.

Gibt es eine Möglichkeit, den Plattformtyp aus Konsistenzgründen beizubehalten? Und der Benutzer der Erweiterungsfunktion entscheidet, ob es zulässig sein darf oder nicht? Oder betrachte ich das fälschlicherweise eher als Unannehmlichkeit denn als Merkmal?

+1

Ich schätze, das wirft eine größere Designfrage auf: Wenn die JDBC mit Kotlin geschrieben würde, wäre * jeder * Feldgetter nullfähig? Dies kann sinnvoll sein, da die Bibliothek keine Ahnung hat, ob eine Spalte in einer Tabelle nullfähig ist oder nicht ... – tmn

Antwort

4

Blick aus einem anderen Winkel an ihn: Wenn Sie Ihre Funktionen einen Wert von Plattformtyp zurückgeben LocalDate!, Java unsichere NULL-Zulässigkeit zu den Funktionen Verwendungen in Ihrem Kotlin Code verbreiten würde machen könnten: sie null jederzeit zurückkommen würde, möglicherweise unerwartet an den Aufrufer mit dem Rückgabewert als Nicht-Null.

Kotlin, wiederum is null-safe und es wird nicht erlauben, null leise zu irgendwo, wo es eine NPE verursachen wird. Stattdessen wird jeder Wert entweder als Nullable übergeben oder übergibt eine Nicht-Null-Überprüfung oder Assertion.

Platform types sind nicht denotable in der Sprache, das ist nur eine Möglichkeit, mit unsicheren Java NULL-Zulässigkeit des Umgangs (einfach alle Java-Werte als Nullable-wouldn't work Behandlung). Sie geben Ihnen eine Möglichkeit, anzugeben, dass Sie glauben, dass dieser Aufruf von Java-Code Null nicht zurückgeben wird: Wenn Sie T! als T behandeln, wird eine Assertion generiert, um es zu überprüfen. Ansonsten arbeiten Sie mit dem Plattformtyp T! wie mit Nullable T?.

Null-Sicherheit ist einer der Schlüsselpunkte im Kotlin-Sprachdesign, und Sie müssen sich für jeden Wert in Ihrem Kotlin-Code entscheiden, ob er nullfähig ist oder nicht.

Sie haben zwei Möglichkeiten für die API-Design:

  • Return eines Nicht-Null-Wert, die NULL-Zulässigkeit in Ihrer Funktion Überprüfung
  • Return Nullable-Wert und damit warnen die Anrufer über mögliche null

Wenn jedoch eine Funktion eine Semantik hat, die dem Aufrufer erlaubt anzunehmen, dass er unter bestimmten Bedingungen null nicht zurückgibt, können Sie eine Wrapper-Funktion erstellen, die die Assertion durchführt. Dies ist machbar, wenn es mit zusätzlicher Logik oder einem Rückfall gekoppelt wird, andernfalls wird es kaum prägnanter sein als die Behauptung (!!) an der Aufrufstelle.

Verwandte Themen